面向对象分析和设计笔记——第4章设计模式
面向对象设计原则
1)找出应用中可能需要变化之处,把变化的部分“封装”起来,不要和那些无需变化的代码混在一起,会使代码变化引起的不经意的后果变少,系统因此会变得更有弹性;
2)针对接口(超类型)编程,多使用多态,把几种不同的子类对象当作一种基类型的对象来使用;使代码变得更加简洁、维护性好,此外可以自动的通过JVM动态绑定机制,展现不同子类之间的差异;
3)多用关联,少用继承;在子类可能会进一步扩展时,利用针对接口编程;
4)类应该对修改(现有代码)关闭,对扩展开放,允许系统在不修改代码的情况下,进行功能扩展;
2/23个设计原则
1.Singleton Pattern单一实例设计模式
1)description of the problem
需求描述中很多时候都需要保证一个类仅有一个实例,如:操作系统只需要一个时钟、应用程序中只有一个链接数据库的Connection实例、对于建模固定不变信息的类为节省内存仅需访问一个实例;
一个类有属性信息,但是其所有的属性信息的值是唯一的,而且只能访问,不能修改,可以考虑单一实例模式;
一个类没有属性信息,只有方法,可以考虑用单一实例模式;
2)solutions that includes class structures
应该满足:构造函数必须声明为private;
必须提供一个可以访问该类的public方法,且应同时声明为static、返回这个唯一的对象;
为了约束上述可以返回这个唯一对象的函数每次被调用只创建同样一个对象,声明一个约束变量来控制,故这个约束变量的属性必须声明为private static;
1 private static Singleton instance;//还满足了静态方法gstInstance()只能访问静态变量 2 public static Singleton getInstance() { 3 if (instance == null) { 4 instance = new Singleton();//避免每次调用public的getInstance方法时,创建出来多个static对象 5 } 6 return instance; 7 }
1 public class SCUInfo{ 2 private static SCUInfo singletonInstance; 3 private String name; 4 private String address; 5 private String telephone; 6 private SCUInfo() { 7 name = "SiChuan University"; 8 address = "Renmin Road 1"; 9 postcode = "610065"; 10 } 11 public static SCUInfo getSingletonInstance() { 12 if (singletonInstance == null) {13 singletonInstance = new SCUInfo(); 14 } 15 return singletonInstance;//如果要求控制实例的个数,可以在第5行添加一个计数器变量,此处加&&count<i 16 } 17 public String getName() { 18 return name; 19 } 20 public String getAddress() { 21 return address; 22 } 23 public String getPostcode() { 24 return postcode; 25 } 26 }
3)discussion of the consequences(advantages and disadvantages)
任何客户端都只能访问一个对象;
可以通过增加一个计数器,来很轻易的拓展,从而满足不同客户端的需求;
2.Strategy Pattern策略设计模式
1)要求程序实现某个功能,但是实现方式有多种,如:图书馆借阅系统中,可以会被选择txt文本、HTML、XML三种方式来实现展示借阅信息的功能;用不同格式保存同一个文件;用不同的算法压缩文件;用不同的压缩格式来捕获视频数据;用不同的可视化格式来现实数据;Java中的layoutManager接口以实现容器中的布局;
2)把不同方式封装在不同的类中;
针对共同的目标功能,封装成一个接口;如:Class LibrarySystem、Interface BorrowersFormatter、Class PlainTextBorrowersFormatter、Class HTMLBorrowersFormatter、Class XMLBorrowersFormatter
3)可以轻易扩增新类且大部分程序代码都不会被影像,使设计便于阅读和维护
整个策略的核心部分就是接口的使用,使用策略模式可以在用户需要变化时,修改量很少,而且快速
通用设计方式表达类结构:
1)声明一个“一对一”私有关系的接口类对象
2)给接口类型对象赋值(多态的体现,赋一个Concrete对象)
3)通过接口类型的变量+"."运算符,激活接口类型的变量内部封装的算法,从而实现动态绑定