大话设计模式之装饰者模式

1:装饰模式结构图

  何为装饰模式?动态地给一个对象添加一些额外地指责,就增加功能来说,比生成子类更加灵活。我们发现下图DecoratorA,B和C该类,可以通过内部地Component引用装饰一个Component对象来,达到装饰地效果。其中Component是一个接口,可以通过Decorator类的来装饰一个Component的对象。

 

 

 

2:本案例结构图

 

 

 

 

   类图分析:上图中Person为一个接口,Clother通过实现该接口,同时内部增加一个对该结构地引用来不断得装饰Person地实现类Master对象。而Clother类中该引用不是私有的,所以每一个下面地类都可以使用该引用,来继续实现装饰。

3:代码示例

  •   顶层接口定义
package decoratorPattern;

public interface Person {
    //该方法是关键,因为在从最外层引用该方法时,会将所有装饰者地show都调用一遍
    public void show();
}
  • 被装饰类
package decoratorPattern;

/**
 * @author :dazhu
 * @date :Created in 2020/4/3 9:26
 * @description:实现被装饰的类
 * @modified By:
 * @version: $
 */
public class Master implements Person{
    public String name;

    //构造方法
    public Master(String name){
        this.name = name;
    }

    @Override
    public void show() {
        System.out.println("我是:"+ name);
    }
}
  • 衣服类
package decoratorPattern;

/**
 * @author :dazhu
 * @date :Created in 2020/4/3 9:10
 * @description:实现装饰功能地服装类
 * @modified By:
 * @version: $
 */
public class Clother implements Person {
    public Person p = null;
    //这个方法是关键,当p不为null时,调用p.show()
    //这样,就可以在最外层装饰后,通过p.show来调用次外层地show,然后再调用p.show
    //再调用次次外层的,以此类推。
    @Override
    public void show() {
        if(p != null){
            p.show();
        }
    }

    //装饰方法
    public void Decorate(Person p){
        this.p = p;
    }
}
  • 具体衣服实现类
package decoratorPattern;

/**
 * @author :dazhu
 * @date :Created in 2020/4/3 9:10
 * @description:具体实现衣服的类
 * @modified By:
 * @version: $
 */
public class TShirts extends Clother{
    @Override
    public void show() {
        System.out.println("我是TShirt");
        super.show();
    }
}

package decoratorPattern;


/**
 * @author :dazhu
 * @date :Created in 2020/4/3 9:11
 * @description:具体实现衣服的类
 * @modified By:
 * @version: $
 */
public class BigTrouser extends Clother{

    @Override
    public void show() {
        System.out.println("我是大裤子");
        super.show();
    }
}

package decoratorPattern;

/**
 * @author :dazhu
 * @date :Created in 2020/4/3 9:11
 * @description:具体实现衣服的类
 * @modified By:
 * @version: $
 */
public class Shoes extends Clother{
    @Override
    public void show() {
        System.out.println("我是鞋子");
        super.show();
    }
}

  关键讲解:装饰者实现的关键在于所有装饰类和被装饰类都是实现了同一个接口!!!这样子才能都通过一个内部Person引用来层层的装饰。当然show的方法的实现也很讲究,每次都会调用p.show方法使得,逐层的展示每次的装饰结果。

posted @ 2020-04-03 09:57  大朱123  阅读(244)  评论(0)    收藏  举报