设计模式-结构型模式讲解下(装饰者外观代理)(代码片段)

小毕超 小毕超     2023-01-01     171

关键词:

一、结构型设计模式

上篇,我们讲解了结构型设计模式的适配器、桥接、组合、享元模式。

文章地址:https://blog.csdn.net/qq_43692950/article/details/120248267

这篇文章我们讲解下 结构型设计模式的装饰者、外观、代理模式。

二、装饰者模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。它是作为现有的类的一个包装。
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

举个例子:还是用上篇文章例子中的绘画不同的形状的例子,加入系统中有画各种形状的功能,但随着功能后期的演化,需要画出带有边框的各种形状,那么此时就可以采用装饰者设计模式来做增强。

下面使用程序演示下上面的例子:

  1. 定义形状接口
public interface Shape 
   void draw();

  1. 定义圆形的实现
public class Circle implements Shape 
 
   @Override
   public void draw() 
      System.out.println("开始画圆形!");
   

  1. 定义矩形的实现
public class Rectangle implements Shape 
 
   @Override
   public void draw() 
      System.out.println("开始画矩形!");
   

  1. 定义装饰器的抽象模板
public abstract class ShapeDecorator implements Shape 
   protected Shape decoratedShape;
 
   public ShapeDecorator(Shape decoratedShape)
      this.decoratedShape = decoratedShape;
   
 
   @Override
   public void draw()
      decoratedShape.draw();
     

  1. 定义具体的边框装饰器
public class BorderShapeDecorator extends ShapeDecorator 
 
   public BorderShapeDecorator(Shape decoratedShape) 
      super(decoratedShape);     
   
 
   @Override
   public void draw() 
      decoratedShape.draw();         
      setRedBorder(decoratedShape);
   
 
   private void setRedBorder(Shape decoratedShape)
      System.out.println("画边框!");
   

  1. 演示
public class demo 
   public static void main(String[] args) 
      Shape circle = new Circle();
      circle.draw();

      Shape shape = new BorderShapeDecorator(new Circle());
      shape.draw();

      Shape shape1 = new BorderShapeDecorator(new Rectangle());
      shape1.draw();
   


上面可以看出再不改变原先类的基础上,做了画边框的效果,对原有做增强,使用装饰者设计模式,可以大大提高系统的可扩展性。

三、外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
它的优点是可以减少系统相互依赖、提高灵活性、提高了安全性。但是它不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

举个例子:还是画各种图形的例子,比如要画圆形、矩形、三角形,没画一种图像都要拿到对应的抽象,并调用绘制方法,如果要画的形状过多,这么多的抽象就不好管理了,而如果使用外观设计模式,提供一个统一的抽象,在这个抽象中就可以完成上面不同的绘制,这样就方便了我们的管理。

下面使用程序演示下上面的例子:

  1. 定义形状的接口
public interface Shape 
   void draw();

  1. 定义圆形的实例
public class Circle implements Shape 

    @Override
    public void draw() 
        System.out.println("开始画圆!");
    

  1. 定义矩形的实例
public class Rectangle implements Shape 
 
   @Override
   public void draw() 
      System.out.println("开始画矩形!");
   

  1. 定义三角形的实例
public class Triangle implements Shape 
 
   @Override
   public void draw() 
      System.out.println("开始画三角形!");
   

  1. 定义一个外观类,并调用上面的功能
public class ShapeFacade 
   private Shape circle;
   private Shape rectangle;
   private Shape square;
 
   public ShapeFacade() 
      circle = new Circle();
      rectangle = new Rectangle();
      square = new Triangle();
   
 
   public void drawCircle()
      circle.draw();
   
   public void drawRectangle()
      rectangle.draw();
   
   public void drawSquare()
      square.draw();
   

  1. 演示
public class demo 
   public static void main(String[] args) 
      ShapeFacade shapeFacade = new ShapeFacade();
      shapeFacade.drawCircle();
      shapeFacade.drawRectangle();
      shapeFacade.drawSquare();
   


外观设计模式还是比较容易理解的,就是把多个功能统一整个到一个对象中,由这个对象再去调用具体的类和方法。

四、代理设计模式

通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) 。

代理有分静态代理和动态代理,静态代理就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。而动态代理是在我们使用时,动态的生成代理对象,他是在内存中构建代理对象的。

举个例子,在做数据库操作时,一般我们都会在事物中做SQL的操作,那就需要在操作前开启事物,操作后如果成功就需要提交事物,如果代用代理设计模式,就可以将事物开启提交逻辑放在代理类中,被代理的类,只需要关注业务逻辑即可。

我们以支付和事物为例演示下,代理模式

1. 采用静态代理,实现上面例子

  1. 定义支付接口
public interface PayInterFace 
    void pay();

  1. 定义微信支付实现
public class WxPay implements PayInterFace 
    @Override
    public void pay() 
        System.out.println("支付中...");
    

  1. 定义支付的代理类
public class PayProxy implements PayInterFace 
    private WxPay pay;

    public PayProxy(WxPay pay) 
        this.pay = pay;
    

    @Override
    public void pay() 
        System.out.println("事物开始!");
        pay.pay();
        System.out.println("提交事物!");
    

  1. 演示
public class demo 
    public static void main(String[] args) 
        PayInterFace pay = new PayProxy(new WxPay());
        pay.pay();
    


上面的静态代理,可以看出,我们需要对每个被代理对象设计一个代理类,如果代理的功能非常多,那就需要开发人员写特别多的代理类,下面可以看下动态代理的使用。

2. 采用动态代理,实现上面例子

这里使用JDK自带的动态代理来实现

  1. 还是上面的例子,我们再定义一个支付宝的支付实现
public class ZfbPay implements PayInterFace 
    @Override
    public void pay() 
        System.out.println("支付宝支付中...");
    

  1. 定义代理对象,采用jdk的 InvocationHandler 接口
public class PayProxy implements InvocationHandler 

    private Object object;

    public PayProxy(Object object) 
        this.object = object;
    

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
        System.out.println("事物开始!");
        Object result = method.invoke(object, args);
        System.out.println("提交事物!");
        return result;
    

  1. 演示
public class demo 
    public static void main(String[] args) 
        PayInterFace pay = (PayInterFace) Proxy.newProxyInstance(
                PayInterFace.class.getClassLoader(),
                new Class[]PayInterFace.class,
                new PayProxy(new WxPay()));
        pay.pay();


        PayInterFace pay1 = (PayInterFace) Proxy.newProxyInstance(
                PayInterFace.class.getClassLoader(),
                new Class[]PayInterFace.class,
                new PayProxy(new ZfbPay()));
        pay1.pay();

    


上面使用一个代理类,代理了多个对象,相对于静态代理,是代码更简介,灵活性也更高。

设计模式-行为型模式讲解一(责任链命令迭代器)(代码片段)

一、行为型设计模式上篇,我们呢讲解了结构型设计模式,包括适配器模式、桥接模式、组合模式、装饰者模式、享元模式、代理模式、外观模式。文章地址(适配器、桥接、组合、享元):https://blog.csdn.net/q... 查看详情

设计模式之美学习-结构型-装饰者模式(二十)(代码片段)

什么是装饰者模式在不破坏被装饰类的业务逻辑的情况下进行增强同时支持装饰多层,与代理模式很像装饰者侧重增强,代理侧重控制 JavaIO类图 使用//FileInputStream是转为用于读取文件流的类InputStreamin=newFileInputStream("/user/wa... 查看详情

设计模式结构型(代理模式桥接模式装饰者模式适配器模式)(代码片段)

好文推荐:作者:ByteStefan代理模式在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能(非功能性需求,例如:监控、统计、事务、日志等)。静态代理(原始类可维护-... 查看详情

设计模式----结构型模式之代理模式和装饰者模式的区别

1、代理和装饰者的区别静态代理和装饰者模式的区别:相同点:都要实现与目标类相同的业务接口在两个类中都要声明目标对象都可以在不修改目标类的前提下增强目标方法不同点:目的不同装饰者是为了增强目标对象静态代... 查看详情

软件设计模式

软件设计模式大致能够分为三类。共23种。创建型模式:单例模式,抽象工厂模式。建造者模式,工厂模式。原型模式。结构型模式:适配器模式,桥接模式,装饰模式。组合模式,外观模式,享元模式。代理模式。行为型模式... 查看详情

设计模式总结

1)单一职责原则32)里氏替换原则3)依赖倒转原则54)接口隔离原则5)迪米特法则116)开闭原则4创建型模式,共五种:工厂方法模式8抽象工厂模式1(简单工厂模式)15单例模式21建造者模式13原型模式9结构型模式,共七种:适配器模式1... 查看详情

跟我学java设计模式第三天:代理模式适配器装饰者等其中模式结构(代码片段)

5,结构型模式结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比... 查看详情

设计模式之装饰者模式(代码片段)

对一个方法进行增强有三种方式:1.继承2.装饰者模式(静态代理)3.动态代理(cglib)由于自定义jdbc连接池中会用到装饰者模式,在这里,我们先来介绍装饰者模式。定义:在不必改变原类文件和原类使用的继承情况下,动态的... 查看详情

设计模式结构型模式(代码片段)

目录1、适配器模式类适配器模式对象适配器模式接口适配器模式适配器模式在SpringMVC框架应用的源码剖析2、桥接模式1、手机操作问题2、传统方案解决收集操作问题3、桥接模式解决收集操作问题4、桥接模式在JDBC的源码剖析3、... 查看详情

设计模式之装饰者模式(代码片段)

...况下,给你的(或别人的)对象赋予新的职责。属于结构型设计模式。符合开闭原则,但是会产生更多的类,提高程序复杂性。代码实现//抽象实体类publicabstractclassCakeprotectedabstractStringgetDesc();protectedabstractintcost();//确定的实体类publ... 查看详情

《设计模式》装饰者模式(代码片段)

《设计模式》装饰者模式装饰者模式(DecoratorPattern)是一种结构型设计模式,它允许在不改变现有对象结构的情况下,动态地添加行为或责任到对象上。在装饰者模式中,有一个抽象组件(Component)接... 查看详情

设计模式总览

创建型单例(Singleton)工厂方法(FactoryMethod)抽象工厂(AbstractFactory)构造者(Builder)原型模式(Prototype)结构型外观(Facade)适配器(Adapter)装饰者(Decorator)组合模式(Composite)桥接模式(Bridge)代理模式(Proxy)享元模式(Flyweight... 查看详情

设计模式——建造者模式

分类设计模式总体划分为三大类:创建型模式:工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式模式,共5种。结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式,共7中... 查看详情

装饰者设计模式与静态代理设计模式的对比

相同点:(1) 装饰者类与代理类都需要实现目标类所实现的接口(2) 装饰者类与代理类中都需要声明目标类对象,目的是这些类中都需要调用目标对象的目标方法(3) 装饰者类与代理类都可以在不改变目标类的前... 查看详情

结构型模式-装饰者模式(代码片段)

一:装饰者模式定义在不改变现有对象结构的情况下,动态的给改对象增加一些职责(即增加其额外功能)的模式。装饰者即继承某个类,又持有某个类的引用。装饰(Decorator)模式中的角色:抽... 查看详情

装饰者模式(代码片段)

...加程序复杂性动态装饰时,多层装饰时会更复杂5、相关设计模式装饰者模式和代理模式装饰者模式和适配器模式二、代码示例模拟场景:买煎饼,有些人可能想要加一个鸡蛋,有些人要加两个鸡蛋,有些人要加一根香肠1、v1版... 查看详情

装饰者模式(代码片段)

...;     动态装饰时,多层装饰时会更复杂。6.相关设计模式:代理模式,适配器模式。7.实例目录package8.实例UML类图9.代码1packagecom.geely.design.pattern.structural.decorator.v1;23publicclassBattercake4publicStringgetDesc()5return"煎饼";67publicintco... 查看详情

设计模式

ChainOfResponsibility--责任链极限编程 --先写测试再写代码目的:一条链:request->response抽丝剥茧策略模式 动态添加对象:ArrayListLinkedList 静态工厂方法责任链多态创建型模式,共五种:工厂方法模式、抽象工厂模式、单... 查看详情