装饰器模式和代理模式浅析

前言

今年大年初四,在家窝着第五天了,无聊至极,今天就来写一下设计模式吧。设计模式是大师们编码经验的总结,没有什么神的,今天来写一下装饰者模式和代理模式吧。代理模式和装饰者模式本质上是很像的,都是对一个类的扩展。

第一个类扩展的有以下三种途径:

  1. 继承有子类重写方法进行扩展
  2. 装饰者模式
  3. 代理模式
装饰者模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

装饰者模式对原有类的增强是通过一个装饰类实现的,既可以保证原有类的不变,又可以达到对类的增强。

代码实现

原有接口:

/**
 *
 * @author wangyz
 * @version Shape.java, v 0.1 2019-10-24 16:08
 */
public interface Shape {

    /**
     * 画方法
     */
    public void draw();
}

原有实现类:

/**
 *
 * @author wangyz
 * @version Cricle.java, v 0.1 2019-10-24 16:11
 */
public class Cricle implements Shape {

    /**
     * 画个圆
     */
    @Override
    public void draw() {
        System.out.println("画一个圆");
    }
}

装饰者类:

/**
 *
 * @author wangyz
 * @version ShapeDecorator.java, v 0.1 2019-10-24 16:14
 */
public class ShapeDecorator {

    private Shape shape;

    public ShapeDecorator(Shape shape) {
        this.shape = shape;
    }

    public void draw(){
        shape.draw();
        System.out.println("给圆上红色");
    }
}

测试类:

/**
 *
 * @author wangyz
 * @version DecoratorTest.java, v 0.1 2019-10-24 16:16
 */
public class DecoratorTest {

    /**
     * 装饰者模式测试类
     */
    @Test
    public void test1(){
        ShapeDecorator shapeDecorator = new ShapeDecorator(new Cricle());
        shapeDecorator.draw();
    }
}

运行结果:
在这里插入图片描述

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

代理模式的本质不是对类进行增强,而是对类进行代理,所谓代理就是借用自己的身份行使原类的功能,当然在代理类里可以对类进行加以增强,比如权限校验和日志打印,常见的Spring框架就会对我们项目中的bean进行代理。

代码实现

原有接口:

/**
 *
 * @author wangyz
 * @version Image.java, v 0.1 2019-10-31 17:25
 */
public interface Image {

    /**
     * 展示图片
     * @param fileName
     */
    void display(String fileName);
}

原有类:

/**
 *
 * @author wangyz
 * @version RealImage.java, v 0.1 2019-10-31 17:27
 */
public class RealImage implements Image {

    /**
     * 展示图片
     * @param fileName
     */
    @Override
    public void display(String fileName) {
        System.out.println("展示文件:" + fileName);
    }
}

代理类:

/**
 *
 * @author wangyz
 * @version ProxyImage.java, v 0.1 2019-10-31 17:28
 */
public class ProxyImage implements Image {

    private RealImage realImage;

    public ProxyImage() {
    }

    @Override
    public void display(String fileName) {
        if (realImage == null){
            realImage = new RealImage();
        }
        realImage.display(fileName);
    }
}

测试类:

/**
 *
 - @author wangyz
 - @version ProxyTest.java, v 0.1 2019-10-31 17:31
 */
public class ProxyTest {


    @Test
    public void test(){
        ProxyImage proxyImage = new ProxyImage();
        proxyImage.display("米老鼠.jpg");
    }
}

运行结果:
在这里插入图片描述

小结

代理模式和装饰者模式本质上没有区别,都是新开一个类里维护一个原有类的引用,在新类里写一个方法调用原有类的方法。虽然代理模式和装饰者模式本质上没有区别,但是就功能上还是有区别的,区别有以下几点:

  • 装饰者模式着重于类的功能增强
  • 代理模式着重于类的控制
扫码关注公众号

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值