面向对象(五大原则和工程模式)
五大原则
单一职责原则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 }


浙公网安备 33010602011771号