面向对象(五大原则和工程模式)

五大原则

单一职责原则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 }
复制代码

转载于:https://www.cnblogs.com/zl1121102942/p/5794297.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值