设计模式--装饰模式
2019-11-30 本文已影响0人
daoshud1
什么是装饰模式
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
简单解释
- 装饰模式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活;
- 装饰模式是为已有的功能添加更多功能的一种方式。每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点: 多层装饰比较复杂。并且会给系统添加更多的小类,变的更加复杂;
UML图
代码实现
参照大话设计模式中的示例,以穿衣服为例子
- 创建一个Person类,设置名字并实现show方法
public class Person {
private String name;
public Person(){
}
public Person(String name){
this.name=name;
}
public void show(){
System.out.println(String.format("给 %s 的装扮",this.name));
}
}
- 创建一个服务类,并继承Person类,实现show方法
/**
* 装饰类 继承person,并覆写show方法
* @author ws
* @version 1.0
*/
public class Clothes extends Person {
private Person person;
public Clothes(){
}
//设置装饰方法,并将person做为参数传入
public void Decorator(Person person){
this.person=person;
}
@Override
public void show() {
if(this.person!=null){
person.show();
}
}
}
- 创建“T恤”、“裤子”...其它装饰子类
/**
* 创建T恤,实现穿T恤方法
* @author ws
* @version 1.0
*/
public class Txu extends Clothes {
@Override
public void show() {
System.out.println("T恤");
super.show();
}
}
/**
* 创建裤子类,实现穿裤子的方法
* @author ws
* @version 1.0
*/
public class Kuz extends Clothes {
@Override
public void show() {
System.out.println("裤子");
super.show();
}
}
- 运行
public static void main(String[] args) {
Person person=new Person("等等");
Txu t=new Txu();
Kuz k=new Kuz();
t.Decorator(person);
k.Decorator(t);
k.show();
}
//输出
裤子
T恤
给 等等 的装扮
参照:菜鸟教程、大话设计模式