应用场景
在现有的代码中增加或者删除一些功能,同时对现有的代码结构不会造成影响,同时不会添加子类。如果用继承的方式来拓展一个类的功能,因为继承具有静态特征,耦合度高,并且如果用继承,会使子类膨胀。而装饰器的目标就是:使用组合关系来创建一个包装对象来对真实对象进行修饰,从而在保证子结构不变的前提下,为真实对象提供额外的功能。
UML图
优点
- 采用装饰器模式来拓展对象的功能比采用继承方式更加灵活
- 可以设计出不同的具体装饰类,创造出多个不同行为的组合
缺点
装饰器增加了很多子类,会使程序变复杂
代码实现
interface People
public interface People {
public void diaplay();
}
man.class
public class man implements People{
@Override
public void diaplay() {
System.out.println("我是男生,我要准备出门了");
}
}
woman.class
public class woman implements People {
@Override
public void diaplay() {
System.out.println("我是女生,我要准备出门了");
}
}
Decorator.class
public class Decorator implements People {
People p;
public Decorator(People p) {
this.p = p;
}
@Override
public void diaplay() {
p.diaplay();
}
}
ConcreteDecoratorOne.class
public class ConcreteDecoratorOne extends Decorator{
public ConcreteDecoratorOne(People p1) {
super(p1);
}
@Override
public void diaplay() {
super.diaplay();
addFunction();
}
public void addFunction(){
System.out.println("准备出门,拿好出门所需东西");
}
}
ConcreteDecoratorTwo.class
public class ConcreteDecoratorTwo extends Decorator {
public ConcreteDecoratorTwo(People p1) {
super(p1);
}
@Override
public void diaplay() {
super.diaplay();
addFunction();
}
public void addFunction(){
System.out.println("要出门了,得先化个妆");
}
}
Test.class
public class Test {
public static void main(String[] args) {
People p1 = new man();
People p2 = new woman();
System.out.println("===========装饰之前============");
p1.diaplay();
p2.diaplay();
System.out.println("===========装饰之后============");
Decorator D1 = new ConcreteDecoratorOne(p1);
Decorator D2 = new ConcreteDecoratorTwo(p2);
D1.diaplay();
D2.diaplay();
}
}