美文网首页
设计模式--装饰模式

设计模式--装饰模式

作者: daoshud1 | 来源:发表于2019-11-30 11:30 被阅读0次

什么是装饰模式

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

简单解释

  • 装饰模式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活;
  • 装饰模式是为已有的功能添加更多功能的一种方式。每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。

优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点: 多层装饰比较复杂。并且会给系统添加更多的小类,变的更加复杂;

UML图

image

代码实现

参照大话设计模式中的示例,以穿衣服为例子

  • 创建一个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恤
给 等等 的装扮

参照:菜鸟教程、大话设计模式

相关文章

网友评论

      本文标题:设计模式--装饰模式

      本文链接:https://www.haomeiwen.com/subject/uwcowctx.html