代码改变世界

装饰者模式

2017-08-07 20:44  grows  阅读(179)  评论(0编辑  收藏  举报
  1. 就像平时的穿衣搭配一样,会买一些单品做装饰从而搭配起来的衣服更有亮点或者更加时尚,装饰模式也是基于基本的衣服(被装饰类),加上额外的单品(装饰类),使其拥用更多的附加功能,当然基于开闭原则,进行了抽象。
  2.  装潢模式(装饰模式)目的:

是给目标对象添加额外的功能,当然继承也是可以添加额外的功能,但是相对于装饰模式,其就会暴露出不够灵活以及比较臃肿和静态(提前定义好功能在进行重写扩展)的特点。是继承的替代方案

  1. 涉及的对象:

1) 抽象装饰者(只是一个抽象的装饰便于进行装饰的扩展)

2) 具体的装饰者(提供具体的装饰)

3) 抽象被装饰者(需要被装饰的抽象,便于扩展)

4) 具体的被装饰者

  1. 装饰模式使用场景:

1) 给目标对象动态添加扩展功能也可以卸载这个功能

2) 进行多重装饰

3) 进行基本的排列组合

  1. 代码实现

需要实现同一个接口和适配器模式很像,但是适配器模式实现接口是为了调用源接口,从而把源接口转换为目标接口想要的接口进而能够使用接口不一致的方法

而装饰模式是为了实现额外的功能。

 

package decorate;
/**
 * 被装饰者,也是装饰者实现的接口即统一接口
 * @author Administrator
 *
 */
public interface Clothes {
    public String getName();
    public String style();

}

package decorate;
/**
 * 具体的被装饰类,大衣
 * @author Administrator
 *
 */
public class OverCoat implements Clothes {

    @Override
    public String getName() {
        // TODO Auto-generated method stub
          return "大衣";
    }

    @Override
    public String style() {
        // TODO Auto-generated method stub
       return "长款";
    }
package decorate;
/**
 * 装饰者 实现 被装饰者进行额外功能的实现
 * @author Administrator
 *
 */
public abstract class Accessories implements Clothes {
    private Clothes clothes;
    Accessories(Clothes clothes){
        this.clothes=clothes;
    }
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return clothes.getName();
    }

    @Override
    public String style() {
        // TODO Auto-generated method stub
        return clothes.style();
    }
}
package decorate;
/**
 * 装饰具体类 丝巾
 * @author Administrator
 *
 */
public class Silk extends Accessories {

    Silk(Clothes clothes) {
        super(clothes);
        // TODO Auto-generated constructor stub
    }
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return super.getName()+"带上了丝巾";
    }

    @Override
    public String style() {
        // TODO Auto-generated method stub
        return super.style()+"带上了长的丝巾";
    }

}

 

 

package decorate;
/**
 * 装饰具体类 腰带
 * @author Administrator
 *
 */
public class Belt extends Accessories {

    Belt(Clothes clothes) {
        super(clothes);
        // TODO Auto-generated constructor stub
    }
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return super.getName()+"带上了腰带";
    }

    @Override
    public String style() {
        // TODO Auto-generated method stub
        return super.style()+"带上了红色的腰带";
    }

}
package decorate;

public class testDecorate {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Clothes coat=new OverCoat();//大衣
        Clothes silk=new Silk(coat);//加上丝巾
        Clothes belt=new Belt(coat);//加上腰带
        Clothes beltAndSilk=new Belt(new Silk(coat));//既加上了腰带也加上了丝巾
        System.out.println(silk.getName());
        System.out.println(belt.getName());
        System.out.println(beltAndSilk.getName());
        System.out.println(silk.style());
        System.out.println(belt.style());
        System.out.println(beltAndSilk.style());
    }

}

 

大衣带上了丝巾
大衣带上了腰带
大衣带上了丝巾带上了腰带
长款带上了长的丝巾
长款带上了红色的腰带
长款带上了长的丝巾带上了红色的腰带