1:适配器模式
一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
类适配器模式
适配的类的API转换成为目标类的API,使用继承关系,新增接口的方式来适配
对象适配器模式
不同是使用委派关系,适配器的构造方法中传入对象的方式来适配,
建议使用对象适配器模式
Android中的Listview和BaseAdapter的关mListview.setAdapter(mAdapter)就是对象适配器模式
缺省适配模式
不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。这样抽象类再继承下去的子类就不必实现所有的方法了。
Android中基类BaseActivity经常有initView(),initEvent(),initData(),但是有的页面不需要都去实现三个方法,可以使用缺省适配一下,保证一些页面不必实现所有方法!
参考:
《JAVA与模式》之适配器模式
2:合成模式(组合模式)
使用面向对象的思想来, 统一抽象了容器和叶子的公共抽象组件,然后对整体进行递归组合实现树形结构的构建与处理
组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
透明式合成模式的结构与安全式合成模式不同的是,公共抽象构建的不同,包括了容器和叶子全部方法的是透明,而容器和叶子还需单独构建的是安全模式。
适用场景
在以下情况下可以考虑使用组合模式:
(1) 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
(2) 在一个使用面向对象语言开发的系统中需要处理一个树形结构。
(3) 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。
参考: java设计模式之组合模式 不错
3: 装饰模式(包装模式)
动态地给一个对象添加一些额外的职责
例如:Decorator装饰类中,动态实现了对象的功能职责
public abstract class Decorator implements Person {
protected Person person;
public void setPerson(Person person) {
this.person = person;
}
public void eat() {
person.eat();
}
}
实例化的装饰A,在对象原来功能下super.eat(),动态增加了新的功能reEat()
public class ManDecoratorA extends Decorator {
public void eat() {
super.eat();
reEat();
System.out.println("ManDecoratorA类");
}
public void reEat() {
System.out.println("再吃一顿饭");
}
}
参考:
java模式—装饰者模式
装饰和继承的区别:
装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了
缺点:比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像
透明性的要求
对的
TheGreatestSage sage = new Monkey();
TheGreatestSage bird = new Bird(sage);
错的
Monkey sage = new Monkey();
Bird bird = new Bird(sage);
半透明的装饰模式
在增强性能的时候,往往需要建立新的公开的方法。导致了大多数的装饰模式的实现都是“半透明”的,而不是完全透明的。换言之,允许装饰模式改变接口,增加新的方法。
装饰模式的用意是在不改变接口的前提下,增强所考虑的类的性能
半透明的装饰模式是介于装饰模式和适配器模式之间的。适配器模式的用意是改变所考虑的类的接口,也可以通过改写一个或几个方法,或增加新的方法来增强或改变所考虑的类的功能。大多数的装饰模式实际上是半透明的装饰模式,这样的装饰模式也称做半装饰、半适配器模式。
对象的适配器模式中也是构造方法中传入对象,对象委派方法实现,不同的是适配器不改变功能
参考: 《JAVA与模式》之装饰模式 很棒