java设计模式之装饰模式

一:今天我们讲到装饰者模式,什么叫做装饰者模式呢?装饰者模式一般又常用于哪些场景呢?

         所谓装饰者模式就是我们一般动态的给某些对象添加一些职责(功能)所用的方式(有点抽象哈,下面会详讲);

         装饰者模式我们一般适用于某些对象经常添加或者删除功能(方法的场景下);

二:今天我们以一个小汤上班的例子来详细讲解一下装饰者模式

        早上起来,小汤同学又要上班了,该怎么去上班呢,步行,骑车,还是打的。。。

         定义一个接口,里面有一个方法就是出发上班的方法

**  * Created by zhou on 2016/4/9.  */ public interface Conponent {
    //小汤同学要出发去上班了
    public  void Operation();
}
       定义一个类实现这个接口,这一个也叫作未被装饰类

**  * Created by zhou on 2016/4/9.  */ public class ConcreteConponent implements  Conponent{
    //这是出发上班的方法,但是还没选择交通方式
    @Override
    public void Operation() {
            System.out.print("小汤同学开始出发去上班");
    }
}
        再 定义一个抽象类(装饰类),所有的交通方式都要实现这个抽象类

**  * Created by zhou on 2016/4/9.  */ public abstract  class Decorator implements  Conponent {
    protected   Conponent conponent;
    public  void setConponent(Conponent conponent){
        this.conponent = conponent;

    }

    @Override
    public void Operation() {
        if(conponent != null){
            conponent.Operation();
        }
    }
}

步行去上班的类

/**  * Created by zhou on 2016/4/9.  */ public class ConcreteDecotatorWalk extends  Decorator {
    public void addA(){
        System.out.print("小汤同学步行去上班");
    }
    @Override
    public void Operation() {
        super.Operation();
        addA();
    }
}

骑车去上班的类

/**  * Created by zhou on 2016/4/9.  */ public class ConcreteDecotatorRide extends  Decorator
{
    public  void addB(){
        System.out.print("小汤同学骑自行车去上班");
    }

    @Override
    public void Operation() {
        super.Operation();
        addB();
    }
}

打的去上班的类

/**  * Created by zhou on 2016/4/9.  */ public class ConcreteConponentText  extends  Decorator{
    private  void addText(){
        System.out.print("小汤同学打的去上班");
    }

    @Override
    public void Operation() {
        //如果以前有动作先进行以前的
        super.Operation();
        //这个就相当于装饰
        addText();
    }
}

接下来就是选择交通方式

 1. 今天准备步行去上班

  

//步行去上班
ConcreteConponent concreteConponent = new ConcreteConponent();
ConcreteDecotatorWalk concreteDecotatorWalk = new ConcreteDecotatorWalk();
concreteDecotatorWalk.setConponent(concreteConponent);
concreteConponent.Operation();


2.今天准备骑车去上班

//骑车去上班
ConcreteConponent concreteConponent = new ConcreteConponent();

ConcreteDecotatorRide concreteDecotatorB = new ConcreteDecotatorRide();
concreteDecotatorB.setConponent(concreteConponent);
concreteDecotatorB.Operation();


3.先步行再打的去上班

/**  * 先是步行,最后走到一半累了,然后打车去上班  */ ConcreteConponent concreteConponent = new ConcreteConponent();
ConcreteDecotatorWalk concreteDecotatorWalk = new ConcreteDecotatorWalk();
concreteDecotatorWalk.setConponent(concreteConponent);
ConcreteConponentText concreteConponentText = new ConcreteConponentText();
concreteConponentText.setConponent(concreteDecotatorWalk);
concreteConponentText.Operation();

一般情况下我们要为某个类增加一个功能通常是实现这个类,在它的子类中增加这个功能,但是我们我们如果频繁增加功能会导致子类非常多,不利于维护,本文中就是一个装饰者模式的设计方式解决了这个问题,这样做的好处就是有效的把类中的装饰功能从类中搬移去除,有效的把类的核心职责和装饰功能分离开,这样也可以去除相关装饰类的重复逻辑。


本项目的github地址: https://github.com/zhouwei5200/DecoreatorDemo

































你可能感兴趣的:(java,java设计模式)