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 }
  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/bloodPhoenix/p/5761280.html
Copyright © 2011-2022 走看看