裝飾器模式中主要有兩個角色:

  • 裝飾器(夾克,帽子)
  • 被裝飾的對象(老王)

裝飾器和被裝飾的對象有兩個特點,也是裝飾器模式的關鍵:

  • 他們實現同一個接口
  • 裝飾器中使用了被裝飾的對象

使用:

/**
 * <p>
 *定義一個接口
 * </p>
 *
 * @author aodeng-低調小熊貓
 * @since 19-7-11
 */
public interface Person {
    /**
     * 計算累計消費
     * @return
     */
    public Double cost();

    /**
     * 輸出信息
     */
    public void show();
}
/**
 * <p>
 *老王( 被裝飾的對象 )實現定義的接口
 * </p>
 *
 * @author aodeng-低調小熊貓
 * @since 19-7-11
 */
public class LaoWang implements Person{
    @Override
    public Double cost() {
        //沒消費,消費爲0
        return 0.0;
    }

    @Override
    public void show() {
        System.out.println("老王我現在消費"+this.cost());
    }
}
/**
 * <p>
 *裝飾器超類,和被裝飾的對象實現同一個接口 Person :
 * </p>
 *
 * @author aodeng-低調小熊貓
 * @since 19-7-11
 */
public abstract class ClothesDecorator implements Person{
    /**
     * 裝飾器中要使用被裝飾器的對象,構造方法中傳入
     */
    protected Person person;

    public ClothesDecorator(Person person){
        this.person=person;
    }
}
/**
 * <p>
 *具體的裝飾,夾克
 * </p>
 *
 * @author aodeng-低調小熊貓
 * @since 19-7-11
 */
public class Jacket extends ClothesDecorator{

    public Jacket(Person person){
        /**
         * super 指向自己超(父)類
         */
        super(person);
    }
    @Override
    public Double cost() {
        //消費一件夾克
        return person.cost()+100;
    }

    @Override
    public void show() {
        person.show();
        System.out.println("老王我現在又消費了一件夾克100,累計用了"+this.cost());
    }
}
/**
 * <p>
 *具體的裝飾,帽子
 * </p>
 *
 * @author aodeng-低調小熊貓
 * @since 19-7-11
 */
public class Hat extends ClothesDecorator{

    public Hat(Person person){
        //指向自己超(父)類
        super(person);
    }

    @Override
    public Double cost() {
        return person.cost()+200;
    }

    @Override
    public void show() {
        person.show();
        System.out.println("老王我現在又消費了一件帽子200,累計用了"+this.cost());
    }
}

測試

/**
 * <p>
 *程序入口
 * </p>
 *
 * @author aodeng-低調小熊貓
 * @since 19-7-11
 */
public class LearnMain {
    public static void main(String[] args) {
        //創建一個老王
        Person laoWang=new LaoWang();
        //老王買了一件夾克
        laoWang=new Jacket(laoWang);
        //老王買了一個帽子
        laoWang=new Hat(laoWang);
        laoWang.show();
/*
        控制檯輸出:
        老王我現在消費0.0
        老王我現在又消費了一件夾克100,累計用了100.0
        老王我現在又消費了一件帽子200,累計用了300.0*/
    }
}

源碼

源碼地址: https://github.com/java-aodeng/hope

.ad:

人工智能被認爲是一種拯救世界、終結世界的技術。毋庸置疑,人工智能時代就要來臨了,科幻電影中的場景將成爲現實,未來已來! 詳情:

相關文章