装饰模式:
装饰模式能够动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式的组成:
1、抽象组件(Component):定义一个接口,可以给这些对象动态的添加职责,是被修饰者。
2、具体组件(ConcreteComponent):继承自抽象组件的具体对象,也可以给这个对象添加一些职责。
3、装饰者(Decorator):装饰抽象类,用于扩展Component的功能,但对于Component来说,不必知道装饰者的存在。
4、具体装饰者(ConcreteDecorator):具体的装饰对象,起到给Component添加功能的职责。
装饰模式uml图:
实例代码如下:
//定义被修饰者
public interface Human {
public void show();
}
// 定义具体的被修饰者,被修饰者开始有自己的一些修饰
public class Person implements Human {
private String name;
public Person(String name){
this.name = name;
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("装扮的" + name);
}
}
// 定义修饰者
public class Finery implements Human {
protected Human human;
public Finery() {
// TODO Auto-generated constructor stub
}
public void Decorate(Human human){
this.human = human;
}
@Override
public void show() {
// TODO Auto-generated method stub
human.show();
}
}
// 定义两个具体的修饰者类
public class Tshirts extends Finery{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("T恤");
super.show();
}
}
public class BigTrouser extends Finery{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("垮裤");
super.show();
}
}
// 客户端使用
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tshirts tshirts = new Tshirts();
BigTrouser bigThouser = new BigTrouser();
Person person = new Person("大磊");
bigThouser.Decorate(person);
tshirts.Decorate(bigThouser);
tshirts.show();
}
}
uml图:
分析:装饰模式是为了能够动态的添加更多的功能的一种方式。当新加的功能仅仅是为了满足一些只在某种特定情况下才会执行,用修饰模式正好合适。修饰模式把每个要装饰的的功能放在一个类里,并让这些类包装所要修饰的对象,因此,当执行特殊行为时,客户端代码可在运行时根据需要有选择地,按顺序地使用装饰功能包装对象。