装饰模式之前的面向对象原则介绍
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。也就是说功能要单一。
开放封闭原则:软件应该可以扩展,但不可以修改。对于扩展是开放的,对于更改是封闭的。
依赖倒转原则:抽象不应该依赖细节,细节不应该依赖抽象。针对对接口编程,不要对实现编程。即高层模块不依赖底层模块,底层模块不依赖高层模块。
里氏代换原则:子类型必须能够替换掉他们的父类型,只有当子类可以替换掉父类,软件单位功能不受影响时,父类才能真正被复用。
二
装饰模式
定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式是为已有功能动态的添加更多功能的一种方式。
代码实现:
//需要被装饰的对象public class Person {
private String name;
public Person(String name) { super(); this.name = name; }
public Person() { super(); }
public void show(){
System.out.println("装扮的"+name); }
}
//功能的抽象类
public class Finery extends Person{
protected Person component; //打扮 public void Decorate(Person component){ this.component = component; } @Override public void show(){ if(component != null){ component.show(); } }
}//继承功能类public class BigTrouser extends Finery { @Override
public void show(){ System.out.println("垮裤"); super.show(); }
}
//继承功能类
public class TShirts extends Finery {
@Override
public void show(){ System.out.println("大T恤"); super.show(); }
}//继承功能类public class WearSneakers extends Finery { @Override public void show(){ System.out.println("破球鞋"); super.show();
}
}
//继承功能类public class WearSuit extends Finery{ @Override public void show(){ System.out.println("西装"); super.show(); }}
//动态给对象添加功能
public class Test { public static void main(String[] args) {
Person xc = new Person("小菜");
System.out.println("第一种装扮:");
WearSneakers w = new WearSneakers();
WearSuit ws = new WearSuit();
BigTrouser bt = new BigTrouser();
/*
* 首先实例化person对象
* 再用WearSneakers类包装person
* 再用WearSuit类来包装WearSneakers对象 * 再用BigTrouser类包装WearSuit对象 * 最终执行BigTrouser的show方法。 *
*/
w.Decorate(xc);
ws.Decorate(w);
bt.Decorate(ws);
bt.show();
}
}
输出结果:
第一种装扮: 垮裤 西装 破球鞋 装扮的小菜
三
什么时候使用装饰模式
优点:
为你推荐以下文章
设计模式(一) | 啥是工厂模式和策略模式?
务实基础篇--Java内存模型及GC原理
深入理解Java中的List、Set与Map集合