zoukankan      html  css  js  c++  java
  • [Design Pattern] : 接口、抽象类的抽象合成

    前言 :

    面向对象设计守则里有一条:多用合成,少用继承。
    面向对象设计守则的内容可以参考,
    [深入浅出设计模式] : http://www.oreilly.com.tw/product_java.php?id=a163
    本篇文章示范如何实作界面、抽象类的抽象合成,让合成之后的类别依然保有抽象方法。

    使用时机 :

    当有一堆抽象类,想要集合成一个大的抽象类时使用。
    例如说
    现在要实作Facade这个模式 可是有些抽象对象的方法,要让使用者去实作。 这个时候,抽象合成就可以派上用场。

    结构 :

    实作 :

    首先先要有一个抽象类

    public abstract class Strategy
    {
        public int ClassMethod001(string x)
        {
            return int.Parse(x);
        }
    
        public abstract string ClassMethod002(int x);        
    }

    再来就是抽象类的合成类别

    public abstract class Context
    {
        // Properties
        private Strategy _strategy = null;
    
    
        // Constructor
        public Context()
        {
            // Agent
            _strategy = new StrategyAgent(this.ClassMethod002);
        }
    
    
        // Methods
        public int ClassMethod001(string x)
        {
            return _strategy.ClassMethod001(x);
        }
    
        public abstract string ClassMethod002(int x);
            
    
        // Class
        private class StrategyAgent : Strategy
        {
            // Delegate
            public delegate string ClassMethod002Delegate(int x);
    
    
            // Properties
            private ClassMethod002Delegate _classMethod002Delegate = null;
    
    
            // Constructor
            public StrategyAgent(ClassMethod002Delegate classMethod002Delegate)
            {
                #region Require
    
                if (classMethod002Delegate == null) throw new ArgumentNullException();
    
                #endregion
                _classMethod002Delegate = classMethod002Delegate;
            }
    
            // Methods
            public override string ClassMethod002(int x)
            {
                return _classMethod002Delegate(x);
            }
        }
    }

    最后我们就可以继承合成类别,来达成继承被合成抽象类的工作。

    public class ContextA : Context
    {
        public override string ClassMethod002(int x)
        {
            return x.ToString("D3");
        }
    }
    
    public class ContextB : Context
    {
        public override string ClassMethod002(int x)
        {
            return x.ToString("X2");
        }
    }

    执行

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                ContextA contextA = new ContextA();
                Console.WriteLine(contextA.ClassMethod001("255"));  
                Console.WriteLine(contextA.ClassMethod002(255));
    
                Console.WriteLine();
    
                ContextB contextB = new ContextB();
                Console.WriteLine(contextB.ClassMethod001("255"));     
                Console.WriteLine(contextB.ClassMethod002(0xFF));            
    
                Console.ReadLine();
            }
        }
    }
  • 相关阅读:
    python os.path.dirname()
    python os.path.basename()方法
    python mmap对象
    python 读取二进制数据到可变缓冲区中
    sklearn常见分类器的效果比较
    用matplotlib获取雅虎股票数据并作图
    使用 lxml 中的 xpath 高效提取文本与标签属性值
    如何用 Python 爬取需要登录的网站
    python 线程及线程池
    使用Python代码处理Excel
  • 原文地址:https://www.cnblogs.com/clark159/p/2205067.html
Copyright © 2011-2022 走看看