做网咖的网站/怎么创建网站?
设计模式(Design Pattern)是针对具有相似特征的问题提供的一套解决方案,代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的,能够有效的提高代码的健壮性、稳定性。
设计模式是一套被反复使用的、多数人知晓的、经过分门别类的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
目前设计模式共分为四大类,所有的设计模式共同遵守开闭总原则。
1.1 设计模式分类
设计模式共分为四大类:创建型模式、结构型模式、行为行模式、J2EE模式;
1. 创建型模式提供了一种在创建对象的同时,隐藏创建对象的方式,而不是使用NEW运算符直接实例化对象。通过此模式,能够分离对象的使用者与创建者,此模式共五种,主要包括:工厂模式(Factory Pattern)、抽象工厂模式(Abstract Factory Pattern)、单例模式(SingleTonPattern)、建造者模式(Builder Pattern)、原型模式(Prototype Pattern);
2. 结构型模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。主要包括:适配器模式(Adapter Pattern)、装饰器模式(Decorator Pattern)、代理模式(Proxy Pattern)、外观模式(Façade Pattern)、桥接模式(Bridge Pattern)、组合模式(Composite Pattern)、享元模式(Flyweight Pattern)、过滤器模式(Filter、Critical Pattern)
3. 行为型模式关注对象之间的通信,共十二种,主要包括:策略模式(Strategy Pattern)、模板模式(Template Pattern)、观察者模式(Observer Pattern)、迭代器模式(Iterator Pattern)、责任链模式(Chain Of Responsibility Pattern)、命令模式(CommandPattern)、备忘录模式(Memento Pattern)、状态模式(State Pattern)、访问者模式(Visitors Pattern)、中介者模式(Mediator Pattern)、解释器模式(Interpreter Pattern)、空对象模式(Null Object Pattern)。
4. J2EE模式主要关注Web应用的表示层,这些模式是由SunJava Center 鉴定的,共八种,主要有:MVC 模式(MVC Pattern)、业务代表模式(Business Delegate Pattern)、组合实体模式(CompositeEntity Pattern)、数据访问对象模式(Data Access Object Pattern)、前端控制器模式(FrontController Pattern)、拦截过滤器模式(Intercepting Filter Pattern)、服务定位器模式(ServiceLocator Pattern)、传输对象模式(Transfer Object Pattern)。
1.2 设计模式遵守的原则
设计模式模式的总原则就是开闭原则,对扩展开放,对修改封闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括设计模式的总原则提升程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,需要遵守以下六个原则:
1. 单一职责原则
不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,否则就应该把类拆分。
2. 里氏替换原则(Liskov Substitution Principle)
任何基类可以出现的地方,子类一定可以出现。里氏替换原则是继承复用的基石,只有当衍生类可以替换基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
里氏代换原则是对“开-闭”原则的补充。实现“开闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。具体表现为以下四点:
1) 子类必须完全实现父类的方法
2) 子类可以有自己的个性
3) 覆盖或实现父类的方法时输入参数可以被放大:如果父类的输入参数类型大于子类的输入参数类型,会出现父类存在的地方,子类未必会存在,因为一旦把子类作为参数传入,调用者很可能进入子类的方法范畴。
4) 覆写或实现父类的方法时输出结果可以被缩小:父类的一个方法的返回值是一个类型T,子类的相同方法(重载或覆写)的返回值为S,那么里氏替换原则就要求S必须小于等于T,也就是说,要么S和T是同一个类型,要么S是T的子类。
3. 依赖倒转原则(Dependence Inversion Principle)
面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
原始定义:
1) 高层模块不应该依赖低层模块,两者都应该依赖其抽象;
2) 抽象不应该依赖细节(实现类);
3) 细节应该依赖抽象。
依赖倒置原则在java语言中的体现:
1) 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
2) 接口或抽象类不依赖于实现类;
3) 实现类依赖接口或抽象类。
依赖的三种写法:
1) 构造函数传递依赖对象(构造函数注入)
2) Setter方法传递依赖对象(setter依赖注入)
3) 接口声明依赖对象(接口注入)
使用原则:
依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合,我们怎么在项目中使用这个规则呢?只要遵循以下的几个规则就可以:
1) 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
2) 变量的表面类型尽量是接口或者是抽象类
3) 任何类都不应该从具体类派生(只要不超过两层的继承是可以忍受的)
4) 尽量不要复写基类的方法
5) 结合里氏替换原则使用
4. 接口隔离原则(Interface Segregation Principle)
每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
5. 迪米特法则(最少知道原则)(Demeter Principle)
一个类对自己依赖的类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
最少知道原则的另一个表达方式是:只与直接的朋友通信。类之间只要有耦合关系,就叫朋友关系。耦合分为依赖、关联、聚合、组合等。我们称出现为成员变量、方法参数、方法返回值中的类为直接朋友。局部变量、临时变量则不是直接的朋友。我们要求陌生的类不要作为局部变量出现在类中。
6. 合成复用原则(Composite Reuse Principle)
尽量首先使用合成/聚合的方式,而不是使用继承。
以上是设计模式总体分类以及遵守的原则,请大家关注后续的博客,会针对每一个设计模式进行详细的分析与理解。谢谢!