Java设计模式之静态代理模式(装饰着模式)

版权声明:-万里晴空-祝你前途晴朗 https://blog.csdn.net/qq_35207917/article/details/84483236

静态代理模式与装饰着模式本质上是有区别的,但是具体的区别以后再说,大体上还是有很多共同点的,装饰着模式本质是不对原有对象或者方法改变而增强程序或者方法的功能,实现的是无侵入式编程。

实现要求:

1.被装饰类与装饰类实现同一个接口 目的式是实现无侵入式变成
2.装饰类必须持有原有对象的引用,
3.装饰者去将要增强的方法重写
4.装饰者将不需要增强的方法直接引用

下面是没有被装饰的情况:

接口:
package cn.itcast.test.jt;

/**
 * @Description: 房子的模型
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:12$
 */
public interface HouseM {
    void createHouseM();
    void beanDoor();
}
实现类
package cn.itcast.test.jt;

/**
 * @Description: 造一个房子
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:12$
 */
public class CHM implements HouseM {
    @Override
    public void createHouseM() {
        System.out.println("这个房子有桌子");
        System.out.println("这个房子有床铺");
    }

    @Override
    public void beanDoor() {
        System.out.println("这个门很好,不需要被装饰");
    }
}

下面是测试类:

package cn.itcast.test.jt;

/**
 * @Description:
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:18$
 */
public class Test {
    //得到实现类
    public static HouseM getInterface(){
        //创建一个被装饰类
        CHM chm = new CHM();
        //创建一个装饰类
        //DecorateH decorateH = new DecorateH(chm);
        return chm;
    }

    public static void main(String[] args) {
        HouseM houseM = getInterface();
        houseM.beanDoor();
        System.out.println("------------------------");
        houseM.createHouseM();
    }
}

输出

这个门很好,不需要被装饰
------------------------
这个房子有桌子
这个房子有床铺

给位装饰着模式,对房子进行装饰,新建装饰类

package cn.itcast.test.jt;

import com.mchange.v3.decode.Decoder;

/**
 * @Description: 装饰房子
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:14$
 */
public class DecorateH implements HouseM { //装饰着必须实现原有对象的接口
    //装饰者必须持有原有对象的引用
    private HouseM chm;

    public DecorateH(HouseM chm){
        this.chm = chm;
    }

    @Override
    public void createHouseM() {
        System.out.println("房子需要装饰");
        System.out.println("给房子涂点颜料");
        System.out.println("----------------------------");
        chm.createHouseM();
        System.out.println("---------是不是很好看---------");
    }

    @Override
    public void beanDoor() {
        chm.beanDoor();
    }
}

重写测试类

package cn.itcast.test.jt;

/**
 * @Description:
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:18$
 */
public class Test {
    //得到实现类
    public static HouseM getInterface(){
        //创建一个被装饰类
        CHM chm = new CHM();
        //创建一个装饰类
        DecorateH decorateH = new DecorateH(chm);
        return chm;
    }

    public static void main(String[] args) {
        HouseM houseM = getInterface();
        houseM.beanDoor();
        System.out.println("------------------------");
        houseM.createHouseM();
    }
}
测试结果
这个门很好,不需要被装饰
------------------------
房子需要装饰
给房子涂点颜料
----------------------------
这个房子有桌子
这个房子有床铺
---------是不是很好看---------

总结:
动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。实习的是一种面向接口的编程

猜你喜欢

转载自blog.csdn.net/qq_35207917/article/details/84483236