【问题标题】:How can I segregate fat interface through implementing adaptern pattern?如何通过实现适配器模式来隔离胖接口?
【发布时间】:2012-02-23 13:16:19
【问题描述】:

假设我有一个无法更改的胖接口。而且我还有一些客户端类,它们只想使用该胖接口中的几个方法。这种情况下如何实现适配器模式,实现接口隔离原则?

【问题讨论】:

    标签: c# oop design-patterns adapter interface-segregation-principle


    【解决方案1】:

    您可以执行以下操作:

    // Assuming this is your fat interface
    interface IAmFat
    {
        void Method1();
        void Method2();
        ...
        void MethodN();
    }
    
    // You create a new interface that copies part of the fat interface.
    interface IAmSegregated
    {
        void Method1();
    }
    
    // You create an adapter that implements IAmSegregated and forward
    // calls to the wrapped IAmFat.
    class FatAdapter : IAmSegregated
    {
        private readonly IAmFat fat;
    
        public FatAdapter(IAmFat fat)
        {
            this.fat = fat;
        }
    
        void IAmSegregated.Method1()
        {
            this.fat.Method1();
        }
    }
    

    【讨论】:

    • +1 没有人想变胖(或被隔离):(
    • 所以我还需要一个实现 IAmFat 的类,以及将哪个实例注入 FatAdapter 构造函数?
    • 不,如果你的胖类没有接口,你只需注入那个类。如果这个类有静态方法,你根本不需要注入它,你可以直接从FatAdapter中调用其中一个。
    • 假设 IAmFat 是 System.Web.Hosting 中的 IApplicationHost,因此我需要创建一个实现 IApplicationHost 的类以注入 FatAdapter 构造函数?
    • 如果消费者已经在与IApplicationHost 通话,则意味着已经有IApplicationHost 的实现,您无需创建自己的实现。只需将现有实例注入FatAdapter
    【解决方案2】:

    适配器在这里并不是真正合适的工具。它旨在使两个不兼容的接口能够通过调整一个来进行对话。在这种情况下,您希望根据最终用户以不同方式公开某些功能子集。在这种情况下,您想使用facade

    class Fat{
        public string A();
        public int B(); 
        .
        public void EatMeat()
        .
        public void Z();
    }
    class JennyCraig{
      private Fat f = Fat();
      public string A(){
         return f.A();
      }
      public void Z(){
         return f.Z();
      }
    class Atkins{
        public Fat f = Fat();
    
        public void EatMeat(){
             return f.EatMeat();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2015-08-03
      • 1970-01-01
      相关资源
      最近更新 更多