设计模式
设计原则:
- 找出应用中可能需要变化之处,把它们独立出来,不要把和那些不需要变化的代码混合在一起
- 多用组合,少用继承
- 针对接口编程,而非具体实现编程
- 为了交互对象之间的松耦合设计而努力
- 类应该对扩展开放,对修改关闭
1. 策略模式(strategy)
抽象类: 不能被实例化,只能被继承,需要包含属性和实现方法,子类可以实现其实现的方法
接口: 不能被实例化,只定义方法但不实现,不包括属性,实现接口的类必须实现接口所有的方法,可以被声明为变量
对于需要变化的部分独立出来,使用接口实现。
对不需要变化的部分使用抽象类实现。
例如:
抽象类Duck: 定义基本的行为,perfermFly(),perfermQuack()
QuackBehavior接口: 方法:performquack()
不同方式的Quack行为通过继承接口实现类,Quack类,MuteQuack类
对于Duck的基本行为使用接口声明为变量,调用接口的方法,不同类型的鸭子将接口变量通过使用继承接口的不同类来初始化
2. 观察者模式
java小知识:object类是所有类的父类,位于java.lang包
subject:报社
observer:订阅者
订阅者可以订阅出版社的报纸,也可以取消订阅;出版社可以根据订阅者名单派送新的报纸
Subject接口:定义订阅、取消和通知的函数,registerObserver(),removeObserver(),notifyObserver()
Observer接口:根据数据,定义更新函数,update()
DisplayElement接口:定义显示函数,display()
ConcreteSubject类:继承Subject接口,实现接口的所有函数,Observer数组变量,记录所有Observer,通过调用统一的接口update实现更新
ConcreteObserver类:继承Observer、DisplayElement接口,实现接口的所有函数
其他:
- 实现ConcreteSubject数据变量的封装,由Observer取用需要的数据
- ConcreteObserver类维持一个Subject变量,记录其订阅的Subject,方便取消订阅
java有observer包可以调用
3. 工厂方法
工厂方法模式定义了一个创建对象的接口,由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
Product类:抽象类,定义产品的抽象方法,如Pizza类定义了bake(),cut()等方法
ConcreteProduct类:实现具体产品的方法,实现Pizza抽象类的方法
Creator类:抽象类,定义创建对象的抽象方法,如CreatePizza()
ConcreteCreator类:具体实现CreatePizza(),返回实例化的Product对象
工厂方法将客户代码和工厂代码分隔开(但似乎部分结合了),由客户决定产品的类别 orderPizza(),本地风味的工厂如NewYorkPizzaStore,chicagoPizzaStore,继承PizzaStore抽象类的抽象方法createPizza(),实现不同类型Pizza如NewYorkCheesePizza的实例化
依赖倒置原则:要依赖抽象,不要依赖具体类
4. 抽象工厂模式
原料工厂的接口:PizzaIngredientFactory,定义某些原料的方法createCheese()等
不同区域的工厂继承接口:ChicagoIngredientFactory,实现接口的所有方法,返回具体原料的实例如mozzarellaCheese
原料:Cheese接口等
原料的不同类型:继承Cheese接口,MozzarellaCheese等
Pizza抽象类在prepare方法,使用不同类型的Pizza实现prepare方法,具体使用什么原料,只需要传给它工厂的对象即可,由工厂返回具体原料,而不需要Pizza去分辨原料的不同
5. 抽象工厂模式和工厂方法的不同
抽象工厂使用的是组合,创建一个产品家族的抽象类型(通常使用接口,实例化的子类通过传递),这个类型的子类定义了产品被产生的方法,要想使用这个工厂,必须先实例化它,然后将它传入针对一些抽象类型所写的代码中。当需要创建产品家族和想让制造的相关产品集合起来时,可以使用抽象工厂模式
工厂方法使用的是继承,通过子类创建对象,通过这种做法,客户只需要知道他们所使用的抽象类型(通常使用抽象类)就可以了,而由子类来负责决定具体类型。将客户代码从需要实例化的具体类中解耦。
抽象工厂模式-与-工厂方法模式区别
简单工厂、工厂方法与抽象工厂的区别
6. 适配器模式和外观模式
适配器模式:将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间
接口的适配器:
类和对象的适配器:
Java是单继承,必须目标是接口
java之类适配器
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用
设计原则:最少知识原则
7. 迭代器与组合模式
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
单一责任:类的每个责任都有改变的潜在区域,超过一个责任,意味着超过一个改变的区域,尽量让每个类保持单一责任
组合模式:允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合