zoukankan      html  css  js  c++  java
  • [Design Pattern] Substitute Interface

    [Design Pattern] Substitute Interface

    目的

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

    情景

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

    情景01

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

    情景02

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

    情景03

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

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

    情景04

    结构

    结构01

    参与者

    Substitute

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

    Primary

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

    Secondary

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

    合作方式

    合作方式01

    实作

    • 类别图

      实作01

    • 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();
          }
      }
      
    • 执行结果

      实作02

    下载

    范例程序代码:点此下载

  • 相关阅读:
    Privacy Policy
    MINE
    IOS的浅拷贝和深拷贝
    Mine
    IOS8Preview-xCode_6
    IOS8Preview-Huge for developer and Massive for everyone else
    java-Filter
    Java-servlet
    Java-基本的程序设计结构
    银行应用系统安全性设计(3):密钥及其管理
  • 原文地址:https://www.cnblogs.com/clark159/p/3669702.html
Copyright © 2011-2022 走看看