资讯专栏INFORMATION COLUMN

设计模式第三弹【Proxy,Decorator,Mediator】

wemall / 302人阅读

摘要:但它们还是具有不同的设计目的。模式构成一个对象并为用户提供一致的接口。另外,着重控制对象。是将需要装饰的对象通过构造函数的方式传入。参考文献大话设计模式模式与模式的异同之我见代理模式装饰器模式

Proxy代理模式
代理模式,为其他对象提供一种代理以控制对这个对象的访问


看代码更清晰

//Main函数
public class Main {
    public static void main(String[] args) {
        Printable p = new PrinterProxy("Alice");
        System.out.println("Print by:"+p.getPrinterName());
        p.setPrinterName("Bob");
        System.out.println("Print by:"p.getPrinterName());
        p.print("Hello, world.");
    }
}

//Printable接口
public interface Printable {
    public abstract void setPrinterName(String name);   
    public abstract String getPrinterName();            
    public abstract void print(String string);      
}

//重点来了
//PrinterProxy代理类
public class PrinterProxy implements Printable {
    private String name;            
    private Printer real;           
    public PrinterProxy() {
    }
    public PrinterProxy(String name) {      
        this.name = name;
    }
    public synchronized void setPrinterName(String name) {  
        if (real != null) {
            real.setPrinterName(name);  
        }
        this.name = name;
    }
    public String getPrinterName() {    
        return name;
    }
    public void print(String string) {  
        realize();
        real.print(string);
    }
    private synchronized void realize() {   
        if (real == null) {
            real = new Printer(name);
        }
    }
}

//Printer 
public class Printer implements Printable {
    private String name;
    public Printer() {
        heavyJob("Printer,heavyJob");
    }
    public Printer(String name) {
        this.name = name;
        heavyJob("Printer‚(" + name + ")‚");
    }
    public void setPrinterName(String name) {
        this.name = name;
    }
    public String getPrinterName() { 
        return name;
    }
    public void print(String string) { 
        System.out.println("=== " + name + " ===");
        System.out.println(string);
    }
    private void heavyJob(String msg) {
        System.out.print(msg);
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            System.out.print(".");
        }
        System.out.println("end");
    }
}


讲到proxy就不得不提到decorator装饰模式。这两种模式很相似,经常会混淆。

Decorator装饰模式
装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。

对于Component来说,是无需知道Decorator的存在,Decorator是从外类来扩展Componnent类的功能。
看代码

//Main
public class Main {
    public static void main(String[] args) {
        Display b1 = new StringDisplay("Hello, world.");
        Display b2 = new SideBorder(b1, "#");
        Display b3 = new FullBorder(b2);
        b1.show();
        b2.show();
        b3.show();
        Display b4 = 
                    new SideBorder(
                        new FullBorder(
                            new FullBorder(
                                new SideBorder(
                                    new FullBorder(
                                        new StringDisplay("hello")
                                    ),
                                    "*"
                                )
                            )
                        ),
                        "/"
                    );
        b4.show();
    }
}

//Display
public abstract class Display {
    public abstract int getColumns();               
    public abstract int getRows();                  
    public abstract String getRowText(int row);     
    public final void show() {                      
        for (int i = 0; i < getRows(); i++) {
            System.out.println(getRowText(i));
        }
    }
}

//Border
public abstract class Border extends Display {
    protected Display display;          
    protected Border(Display display) {
        this.display = display;
    }
}

//这里只举一个实现类的例子
public class SideBorder extends Border {
    private char borderChar;                       
    public SideBorder(Display display, char ch) {   
        super(display);
        this.borderChar = ch;
    }
    public int getColumns() {                      
        return 1 + display.getColumns() + 1;
    }
    public int getRows() {                          
        return display.getRows();
    }
    public String getRowText(int row) {             
        return borderChar + display.getRowText(row) + borderChar;
    }
}
Proxy && Decorator

GoF提到它们的区别时,说到:
这两种模式都描述了怎样为对象提供一定程度上的间接引用,它们的实现部分都保留了指向另一个对象的指针,向这个对象发送请求。但它们还是具有不同的设计目的。
Proxy模式构成一个对象并为用户提供一致的接口。但与Decoratro模式不同的是,Proxy模式不能动态的添加或分离性质,也不是为递归组合而设计的。它的目的是,当直接访问一个不方便或不符合需要时,为这个实体提供一个替代者。

Proxy从语义上来说,就是一个代理类,我不需要知道你具体是哪个类实现的,我只需要能够访问这个提供服务的代理对象就可以。另外,Proxy着重控制对象。
Decorator更注重于装饰。是将需要装饰的对象通过构造函数的方式传入。
比较一下上述代码。注意装饰器和代理的初始化位置和方式
//Proxy在执行前后可以再做其他事,增强能力,改变的是行为。
//Decorator 目的是为了改变print的内容,先get内容,在get内容的方法中进行修改。

Mediator 中介者模式
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立改变它们之间的交互。

把对象之间复杂的耦合写到mediator中,让mediator与其他对象的关联是整齐统一的。从而提高可用性和扩展性。

mediator与facade之间的区别

都是是把复杂的东西隐藏起来,让别人看起来比较简单。都没有简单化。只是进行隐藏。【需要考虑代价】
mediator是把对象之间复杂的关系都联系起来。相当于集线器。把所有东西和集线器联系起来。逻辑更为复杂。【仔细衡量是否一定需要。否则会有很大复杂性。】
facade是把外面的东西和内部的东西分开简单化。类似于包装盒。不管内部多复杂,对外只需要一个接口,外部不需要关心内部是如何实现。

参考文献:

《大话设计模式》

Decorator模式与Proxy模式的异同之我见

代理模式 & 装饰器模式 (Proxy & Decorator)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65975.html

相关文章

  • Design Pattern的万剑归宗 => Mediator

    摘要:大意就是作者把种不断的重组归纳抽象直道最后抽象为一种设计模式,。而所有的关注的核心问题就是如何控制信息流但是我个人认为核心是如何解耦。再根据信息流划分出对象在系统中担任的种角色,。所以归为一种核心所有的的职责都是控制。 Overview 今天看了YouTube上的一个讲Design Pattern的视频,把这个视频的大意给大家分享一下,该视频的作者是Anthony Ferrara。 ...

    yuanzhanghu 评论0 收藏0
  • 常用设计模式

    摘要:工厂设计模式工厂设计模式,主要用于进行实例化对象时的解耦操作,避免使用关键字实例化对象,通过反射,根据类名称动态创建对象示例静态工厂模式构造方法私有化获取指定类名称的对象动态代理模式动态代理模式,主要用于对同一接口子类的相同逻辑进行代理操作 工厂设计模式 工厂设计模式,主要用于进行实例化对象时的解耦操作,避免使用new关键字实例化对象,通过反射,根据类名称动态创建对象 示例: pa...

    fizz 评论0 收藏0
  • PHP 设计模式

    摘要:创建型设计模式通过控制这个对象的创建方式来解决此问题。抽象工厂模式建造者模式工厂方法模式多例模式对象池模式原型模式简单工厂模式单例模式静态工厂模式结构型在软件工程中,结构型设计模式是通过识别实体之间关系来简化设计的设计模式。 创建型在软件工程中,创建型设计模式是处理对象创建机制的设计模式,试图以适当的方式来创建对象。对象创建的基本形式可能会带来设计问题,亦或增加了设计的复杂度。创建...

    sewerganger 评论0 收藏0
  • 设计模式

    摘要:设计模式目的为了代码可重用性让代码更容易被他人理解保证代码可靠性设计原则设计原则是设计模式为了达到其目的,所实现的一些准则。 设计模式简介 1.什么是设计模式 设计模式对是经验的总结,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。代表了最佳的实战。 2.提出及GOF 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnso...

    enrecul101 评论0 收藏0
  • 设计模式

    摘要:建议参看学习创建型模式工厂模式抽象工厂模式单例模式建造者模式原型模式结构型模式适配器模式接口转换桥接模式过滤器模式组合模式装饰器模式外观模式门面模式前台接待享元模式代理模式行为型模式责任链模式工作流命令模式解释器模式 建议参看github学习 1.创建型模式(creational) 工厂模式(factory)抽象工厂模式(abstract factory)单例模式(singleton)...

    pekonchan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<