本帖最后由 大山哥哥 于 2017-4-26 16:59 编辑
前言: 何为装饰者模式: 在不改变原类和继承的情况下动态的扩展对象的功能.通过包装一个对象(类)来实现一个新的具有原来对象相同接口的对象(类).
装饰者模式的特点: 1. 在不改变原有对象的原本的结构上进行功能的添加. 2. 装饰对象和原对象都实现了相同的接口.可以使用于原有对象的方式使用装饰对象. 3. 装饰对象中包含原有对象.即装饰对象是真的的原始对象经过包装之后的对象.
使用环境: 1. 在不影响其他对象的情况下.以动态.透明的方式给单个对象题添加职责. 2. 处理那些可以撤销的职责. 3. 当不您呢个采用生成子类的方法进行扩充的时.一种情况是可能大量独立的扩展.为支持每一种扩展将产生大量的之类.使得之类的数量呈爆炸性增长.另一中情况是因为定义的类被隐藏.或是不能用于生成子类. 参与者: 1. 被装饰的对象基类. 2. 被装饰的对象. 3. 装饰者抽象类 4. 具体的装饰者
代码:
// 基类 接口或者是抽象类 会被 被原始对象或是装饰对象继承或是实现 [Java] 纯文本查看 复制代码 public interface Person {
void eat();
}
// 原始对象 实现基类的接口 [Java] 纯文本查看 复制代码 public class Man implements Person {
public void eat() {
System.out.println("男人在吃");
}
}
// 装饰者的抽象类 实现基类接口 [Java] 纯文本查看 复制代码 public abstract class Decorator implements Person {
protected Person person;
public void setPerson(Person person) {
this.person = person;
}
public void eat() {
person.eat();
}
}
//装饰者 继承装饰者的抽象类.而抽象类实现了基类接口那么 此类中也相当于继承了 基类中的方法 [Java] 纯文本查看 复制代码 public class ManDecoratorA extends Decorator {
public void eat() {
super.eat();
reEat();
System.out.println("ManDecoratorA类");
}
public void reEat() {
System.out.println("再吃一顿饭");
}
}
public class extends Decorator {
public void eat() {
super.eat();
System.out.println("===============");
System.out.println("ManDecoratorB类");
}
}
// 测试类 [Java] 纯文本查看 复制代码 public class Test {
public static void main(String[] args) {
Man man = new Man();
ManDecoratorA md1 = new ManDecoratorA();
ManDecoratorB md2 = new ManDecoratorB();
md1.setPerson(man);
md2.setPerson(md1);
md2.eat();
}
} 总结: 动态的将功能附加到对象上.想要扩展功能.装饰者是有别于继承的另一种选择. 图解
|