zoukankan      html  css  js  c++  java
  • 面向对象(五大原则和工程模式)


    五大原则

    单一职责原则SRP(Single Responsibility Principle)
    是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

    开放封闭原则OCP(Open-Close Principle)
    一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
    那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

    里氏替换原则(the Liskov Substitution Principle LSP)
    子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
    也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

    依赖倒置原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,
    这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
    了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

    迪米特法则
    迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
    英文简写为: LoD.迪米特法则可以简单说成:talk only to your immediate friends。 对于面向OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

      迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
    迪米特法则不希望类直接建立直接的接触。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
    有兴趣可以研究一下设计模式的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。

    工厂模式

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace 设计模式
      8 {
      9 
     10     //class GongChang
     11     //{
     12     //    //设计模式:工厂模式,单例模式
     13     //    //《大话设计模式》
     14     //}
     15 
     16     //计算器
     17     //class JiSuanQi
     18     //{
     19     //    private int a;
     20 
     21     //    public int A
     22     //    {
     23     //        get { return a ; }
     24     //        set { a  = value; }
     25     //    }
     26 
     27     //    private int b;
     28 
     29     //    public int B
     30     //    {
     31     //        get { return b; }
     32     //        set { b = value; }
     33     //    }
     34 
     35     //    public int JiaFa()
     36     //    {
     37     //        return a+b;
     38     //    }
     39 
     40     //}
     41 
     42     //改进计算器
     43     public class JiSuan
     44     {
     45         private int a;
     46 
     47         public int A
     48         {
     49             get { return a; }
     50             set { a = value; }
     51         }
     52 
     53         private int b;
     54 
     55         public int B
     56         {
     57             get { return b; }
     58             set { b = value; }
     59         }
     60         public virtual int YunSuan()
     61         {
     62             return 0;
     63         }
     64       
     65     }
     66 
     67     //加法类
     68     public class Jia:JiSuan
     69     {
     70         public override int YunSuan()
     71         {
     72             return base.A+base.B;
     73         }
     74     }
     75 
     76     //减法类
     77     public class Jian : JiSuan
     78     {
     79         public override int YunSuan()
     80         {
     81             return base.A - base.B;
     82         }
     83     }
     84 
     85     //乘法类
     86     public class Cheng: JiSuan
     87     {
     88         public override int YunSuan()
     89         {
     90             return base.A * base.B;
     91         }
     92     }
     93     //工厂类
     94     public class GongChang
     95     {
     96         public static JiSuan DuiXiang(string s)
     97         {
     98 
     99             switch (s)
    100             {
    101                 case "+":
    102                     return new Jia();
    103                     break ;
    104                 case "-":
    105                     return new Jian();
    106                     break ;
    107                 case "*":
    108                     return new Cheng();
    109                     break ;
    110                 default: 
    111                     return new Jia();
    112             }
    113         }
    114     }
    115 
    116     class Program
    117     {
    118         static void Main(string[] args)
    119         {
    120             //Console.WriteLine("请输入第一个数");
    121             //int a = int.Parse(Console.ReadLine());
    122 
    123             //Console.WriteLine("请输入第二个数");
    124             //int b = int.Parse(Console.ReadLine());
    125 
    126             //JiSuanQi JS =new JiSuanQi ();
    127             //JS.A =a;
    128             //JS.B=b;
    129             //Cheng ch = new Cheng();
    130             //ch.A = 10;
    131             //ch.B = 20;
    132             
    133             Console.WriteLine("输入一个符号");
    134             string a=Console.ReadLine();
    135             JiSuan js = GongChang.DuiXiang(a );
    136             js.A = 3;
    137             js.B = 4;
    138 
    139             Console.WriteLine(js.YunSuan());
    140             Console.ReadLine();
    141 
    142         }
    143     }
    144 }
  • 相关阅读:
    Xcode9自带版本控制系统(Git)的使用
    iOS中的枚举:enum, NS_ENUM, NS_OPTIONS的使用区别
    iOS页面右滑返回的实现方法总结
    [C++]项目中的代码注释规范(整理)
    Dynamic Time Warping 动态时间规整算法
    动态时间归整/规整/弯曲(Dynamic time warping,DTW)
    隐马尔科夫模型HMM学习最佳范例
    蓝牙4.0协议基本介绍以及展望
    UART的CTS与RTS
    KEIL MDK输出map文件分析
  • 原文地址:https://www.cnblogs.com/bloodPhoenix/p/5761280.html
Copyright © 2011-2022 走看看