常见的六种设计模式
(2019-01-24 16:41:45)分类: java |
设计模式:
设计模式的价值:易复用,易拓展,易维护
23种设计模式:
1、创建型模式:提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。
工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式;
2、结构型模式:关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、代理模式;
3、行为型模式:关注对象之间的通信。
责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模版模式、访问者模式。
六种常见的设计模式:1、工厂模式;2、单例模式;3、策略模式;4、观察者模式;5、迭代器模式;6、模版方法模式。
依赖倒置原则:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体,具体应该依赖于抽象。
1、工厂模式
概念:这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
实现(JAVA):a、创建一个接口;b、创建实现接口的实体类;c、创建一个工厂,生成基于给定信息的实体类对象;d、使用该工厂,通过传递类型信息来获取实体类的对象。
2、单例模式
概念:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
实现(JAVA):a、创建一个 Singleton 类(创建 SingleObject 的一个对象、让构造函数为
private,这样该类就不会被实例化、获取唯一可用的对象);b、从 singleton
类获取唯一的对象(getInstance)。
3、策略模式
概念:在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变
context 对象的执行算法。
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
实现(JAVA):a、创建一个接口;b、创建实现接口的实体类;c、创建 Context 类;d、使用 Context
来查看当它改变策略 Strategy 时的行为变化。
4、观察者模式
概念:当对象间存在一对多关系时,则使用观察者模式(Observer
Pattern)。观察者订阅被观察者的状态,当被观察者状态改变的时候会通知所有订阅的观察者的过程。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
实现(JAVA):a、创建Subject类,该类中带有观察者与client的绑定和解绑关系;b、创建Observer抽象类,该类中有受保护的Subject对象和用来更新的update抽象方法;c、创建实体观察者类,继承Observer并实现update方法;d、使用Subject和实体观察者对象。
5、迭代器模式
概念:这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
实现(JAVA):a、创建一个叙述导航方法的Iterator接口和一个返回迭代器的Container接口;b、创建实现了Container接口的实体类NameRepository。该类有实现了Iterator接口的内部类NameIterator,在内部类中记录当前位置;c、使用
NameRepository来获取迭代器,并打印名字。
6、模版模式
概念:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
实现(JAVA):a、创建一个抽象类,它的模板方法被设置为
final;b、创建扩展了上述类的实体类(创建子类);c、在子类中重写模版方法中的具体步骤(模版方法结构不能改动)
注:基本方法,由子类实现的方法,并且在模板方法中被调用;模板方法,是一个或者几个,一般是一个具体方法/框架,实现对基本方法的调度,完成固定的逻辑。策略模式,解决的是相同的问题,只是其方案是将各个接口封装为类,通过委托/组合方式解决问题。
前一篇:Perl子函数传参