[Design Pattern] Substitute Interface

目的

将对象的成员建立为替身接口的成员,用来解耦对象之间的循环相依。

情景

假设开发人员接手一个系统,在系统里有订单对象、送货物件,其中订单对象使用送货物件所提供的送货方法。

当系统继续设计下去,会发现送货方法需要订单对象的相关信息才能决定如何送货。例如说:送货方法需要商品数量,来决定要派卡车送货还是要派机车送货;送货方法需要商品价格来决定要用盒子包还是要用纸袋包。当送货方法的逻辑越来越复杂的时候,最终就会发现送货方法需要订单对象的所有成员才能满足送货方法的运算需求。

送货方法需要订单对象的所有成员,很直觉的设计就是将订单对象作为送货方法的参数,用以提供订单对象的所有成员来满足送货方法的运算需求。系统设计到了这个阶段,就会发现订单对象使用送货物件、而送货物件也使用了订单对象,这也就是产生了对象之间循环相依的问题。(在.NET中,对象之间的循环相依是能够通过编译、并且执行的设计)

为了解决对象之间循环相依的问题,回过头思考订单对象、送货物件之间的关系。会发现在送货物件的送货方法中,其实需要的是订单对象的「所有成员」,而不是真的需要一个订单对象。

这时开发人员可以将订单对象的所有成员,建立为一个「替身接口」并且让订单对象来继承这个接口,用来透过替身接口来提供订单对象的所有成员。接着送货物件中的送货方法,改为使用这个替身接口做为参数,这样就可以取得订单对象的所有成员,而不需要将订单对象作为送货方法的参数。也就是说经由这样的设计,让订单对象、送货物件都改为相依于替身接口,进而就解除了订单对象、送货物件之间循环相依的问题。

结构

参与者

Substitute

  • 提供Primary对象的所有成员。

Primary

  • 实作Substitute界面。
  • 持有Secondary对象的参考。
  • 将本身视为Substitute接口来做为Secondary对象的函式参数,用以提供所有成员。

Secondary

  • 使用Substitute接口做为函式参数,来取得Primary对象的所有成员。

合作方式

实作

  • 类别图

  • IOrder

    public interface IOrder
    {
    // Properties
    int Quantity { get; set; } int Amount { get; set; } // Methods
    void Deliver();
    }
  • Order

    public class Order : IOrder
    {
    // Fields
    private readonly Deliverer _deliverer = new Deliverer(); // Properties
    public int Quantity{get; set;} public int Amount { get; set; } // Methods
    public void Deliver()
    {
    _deliverer.Deliver(this);
    }
    }
  • Deliverer

    public class Deliverer
    {
    // Methods
    public void Deliver(IOrder order)
    {
    // Print
    Console.WriteLine(order.Quantity);
    Console.WriteLine(order.Amount);
    }
    }
  • Program

    class Program
    {
    static void Main(string[] args)
    {
    // Test
    var order = new Order();
    order.Quantity = 12345;
    order.Amount = 67890;
    order.Deliver(); // End
    Console.WriteLine("End...");
    Console.ReadLine();
    }
    }
  • 执行结果

下载

范例程序代码:点此下载

[Design Pattern] Substitute Interface的更多相关文章

  1. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  2. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

  3. [转]Design Pattern Interview Questions - Part 3

    State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...

  4. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  5. 为什么要提倡“Design Pattern呢

    为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性. 那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principle,OCP).里 ...

  6. design pattern及其使用

    什么是设计模式? design pattern是一个通用的,可以被重用的关于一个常见的问题的解决方案. 为什么要用设计模式? 引入设计模式的理论基础非常简单.我们每天都会碰到问题.我们可能碰到决定使用 ...

  7. Asp.Net Design Pattern Studynotes -- Part1

    Asp.Net Design Pattern Studynotes -- Part1 let's start with an exampleto entry amazing OO world ! le ...

  8. [Design Pattern] Service Locator Pattern 简单案例

    Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码 ...

  9. [Design Pattern] Factory Pattern 简单案例

    Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...

随机推荐

  1. Binary Tree Postorder Traversal--leetcode难题讲解系列

    https://leetcode.com/problems/binary-tree-postorder-traversal/ Given a binary tree, return the posto ...

  2. 自动SPF生成工具

    到openspf网站去自动生成一下,地址是http://old.openspf.org/wizard.html.详细解释见下图关于spf的详细语法请看http://www.openspf.org/SP ...

  3. p2p研究

    p2p网络结构 中央集中式结构 无集中式非结构 混合式以超级节点结构 穿透原理 防火墙为克隆型(cone net),对称型(Symmetric NAT) 只有克隆型才能用打洞方式穿透 开源方案 htt ...

  4. HTML语言特殊字符对照表(ISO Latin-1字符集)

    HTML字符实体(Character Entities) 有些字符在HTML里有特别的含义,比如小于号<就表示HTML Tag的开始,这个小于号是不显示在我们最终看到的网页里的.那如果我们希望在 ...

  5. 网络爬虫urllib2 tornado

    百度不支持用tornado请求,可以用美团开放API 测试. import tornado.httpclient def fetch(url): http_header={'User-Agent':' ...

  6. windows下远程连接ubantu

    要实现windows下连接ubantu需要安装以下软件: 1. windows下安装winSCP 2. Ubantu下安装OpenSSH Server 可以使用命令行安装openSSH Server: ...

  7. win7中的画图

    下午做一个图像篡改定位实验,在win7下对图像进行修改,然后通过其最低位判断篡改位置. 程序如何都调试不出来.反复简化程序,发现win7中的画图对图像存在优化. 当更改图像后,会自动调整当前图像的显示 ...

  8. Table_EXISTS_ACTION=APPEND时导入数据时

    11g对数据泵新增了一些功能.这篇介绍新增的选项DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS. Oracle11g的数据泵新增了一个DATA_OPTIONS选项,目前只有一个 ...

  9. UML系列05之 基本流程图

    概要 软件的基本流程图是我们在学习编程时的必修课,它很简单,却很实用.需要说明的是,UML并不包括软件的基本流程图,但是为了方便我自己查阅,所以将基本软件流程图归纳到UML系列当中.读者切不要认为基本 ...

  10. LoopBack – 开源的,可扩展的 Node.js 框架

    LoopBack 是建立在 Express 基础上的开源 Node.js 框架,专门为 Mobile,Web 和其他设备做了优化.LoopBack 能够连接到多个数据源,使用 Node.js 编写业务 ...