java23种设计模式之装饰器模式

上一节说到桥接模式: https://blog.csdn.net/zhanglei082319/article/details/88406311

    桥接模式:将不同的两个对象通过某种平台连接在一起使用,称之为桥接模式。

    今天说一下一种新的设计模式:装饰器模式

    装饰器模式定义: 为一个业务实现,添加该业务内一些其他的职责,称之为装饰器模式。

    还是从手机生产这个话题来讲,我们知道每个手机生产车间都会有包装这个流水线通道。那么就手机产品包装这个业务流程来说,它又可以分为很多子业务,比如包装耳机,包装充电器,包装手机,包装说明书,最后包装完成发货等等。那么这一条线下来我们用java代码如何实现呢?

    请看下面:

      首先我们需要定义一个包装业务接口。

/**
 * 手机包装业务接口
 */
public interface Bag {

    /**
     * 包装
     */
    void  pack();
}

      然后定义一个默认的包装实现类,这里这个默认的实现我们就实现最后一步:打包发货

   

/**
 * 默认包装实现
 */
public class DefaultBag implements Bag{

    @Override
    public void pack() {
        System.out.println("打包完成,发货!");
    }
}

     后面就是包装中各个子环节。

/**
 * 包装耳机
 */
public class HeadSetBag implements Bag {

    /**
     * 内部新的包装修饰
     */
    private Bag bag;

    public  HeadSetBag(Bag bag){
        this.bag = bag;
    }


    @Override
    public void pack() {
        System.out.println("包装耳机!");
        bag.pack();
    }
}

    

/**
 * 包装充电器
 */
public class ChargerBag implements Bag {

    /**
     * 内部新的包装修饰
     */
    private Bag bag;

    public  ChargerBag(Bag bag){
        this.bag = bag;
    }


    @Override
    public void pack() {
        System.out.println("包装充电器!");
        bag.pack();
    }
}
/**
 * 添加说明书包装
 */
public class InstructionBag implements Bag{

    /**
     * 内部新的包装修饰
     */
    private Bag bag;

    public  InstructionBag(Bag bag){
        this.bag = bag;
    }


    @Override
    public void pack() {
        System.out.println("包装说明书!");
        bag.pack();
    }
}
/**
 * 外包装
 */
public class PackageBag implements Bag {

    /**
     * 内部新的包装修饰
     */
    private Bag bag;

    public  PackageBag(Bag bag){
        this.bag = bag;
    }


    @Override
    public void pack() {
        System.out.println("添加外包装!");
        bag.pack();
    }
}
/**
 * 贴上地址标签
 */
public class AddressTagPag implements Bag {

    /**
     * 内部新的包装修饰
     */
    private Bag bag;

    public  AddressTagPag(Bag bag){
        this.bag = bag;
    }


    @Override
    public void pack() {
        System.out.println("贴上地址收件人标签!");
        bag.pack();
    }
}

     到此为止,采用装饰器模式的手机包装业务就此完成。我们测试一下:

     

public class Main {

    public static void main(String[] args) {

        //耳机
        Bag bag = new HeadSetBag(
                //说明书
                new InstructionBag(
                        //充电器
                        new ChargerBag(
                                //打外包装
                                new PackageBag(
                                        //贴标签
                                        new AddressTagPag(
                                                //打包完成 发货
                                                new DefaultBag()
                                        )
                                )
                        )
                )
        );

        bag.pack();
    }
}

    打印结果:

    

   这样将手机包装的业务用java装饰器模式来实现,是不是很优雅。

    其实装饰器模式在实际项目中也有很多应用。比如mybatis中的缓存器就是使用装饰器模式,

   

   mybatis提供默认缓存器,日志缓存器,同键阻塞缓存器,定时清空缓存器,阻塞缓存器,固定大小缓存器等。将这些缓存器用装饰器模式可以很灵活的结合着使用。

猜你喜欢

转载自blog.csdn.net/zhanglei082319/article/details/88592661