原则:
面向对象编程<=>面向接口编程:
细节依赖抽象而非抽象依赖细节,面向接口而非实现编程。例如,面向过程编程时,将常用函数写成程序库,高层模块利用这些数据库。但当新的需求与以往需求高层业务逻辑相似、只想改变数据库或存储方式时,由于高层模块与低层数据库捆绑,无法复用这些高层模块。
面向对象三大特性:封装、继承、多态。
面向对象的好处:可维护、可拓展、可复用、灵活性好。
应猜测最可能出现的变化种类,并通过抽象来隔离这些变化;但刻意抽象所有功能不可取。
单一职责:一个类只能由一个动机引起变化。
里氏代换原则:子类型必须能替换掉它们的父类。正因此,才能在软件不受影响的基础上拓展新功能。
迪米特法则:如果两个类没有相互作用的必要,它们就不要直接交互。如果其中一个类需要调用另一个类的方法,使用第三个类。
模式:
简单工厂模式:由Factory类进行实例化。
工厂模式:由Factory类的子类进行实例化,子类的同名方法只需要return一个相应的类的对象;将选择的任务交给了客户端。
工厂模式的好处:实例化多个对象时,易于更改。
//简单工厂
Operation* operation1 = new Factory.CreateOperation('+');//when the type of calculation
Operation* operation2 = new Factory.CreateOperation('+');//needs changing, there are
Operation* operation3 = new Factory.CreateOperation('+');//3 changes
//工厂
Factory* factory = new AddFactory();//when the type of calculation needs changing, just change it here
Operation* operation1 = factory.CreateOperation();
Operation* operation2 = factory.CreateOperation();
Operation* operation3 = factory.CreateOperation();
策略模式:一系列算法功能相同,只是实现不同。
策略模式的好处:由于传入的参数的类型不同,Context类“选择”了应该实例化哪一个子类(Context的方法只需要调用父类的同名方法),因此就通过继承、多态避免了冗长的条件语句;每个算法都有自己的类、自己的接口,某一个算法的改变不会影响其他算法,因此单元测试更容易;它用相同方法调用所有算法,让使用者知道一个类(Context),从而隐藏了具体实现方法、降低了耦合性。
装饰模式:子类的方法中调用父类的同名方法。
装饰模式的好处:装饰功能在单独一个类中,将其与核心功能分开。
代理模式:Proxy类和RealSubject类实现完全相同的接口,Proxy类的方法只是调用了RealSubject类的同名方法。
代理模式的应用:
1.远程代理。为一个对象在不同地址空间提供局部代理。例如:.Net中的WebService
2.虚拟代理。通过它来存放实例化需要很长时间的对象。例如:打开网页时比图片先出现的图片框
3.安全代理。来控制真实对象访问时的权限。
4.智能指引。调用真实对象时,代理处理另外一些事情。例如:第一次访问某持久对象时将它放入内存;访问某个对象前检查是否已经锁定它。
原型模式:当需要创建多个参数相同的实例时,只需要创建一个,其他的调用clone()即可。clone():创建当前对象的浅表副本。方法创建一个新对象,然后将当前对象的非静态字段复制到该新对象。若当前对象是值类型,则逐位复制;若为引用或指针,则复制引用或指针而不复制对象。
外观模式:为一个层/多个类编写一个接口。使这些层/类的调用者不必了解复杂的实现细节、不会被更改影响。
建造者模式:用一个方法调用一系列方法,由一个指挥者类选择应该调用哪个建造者。通常这一系列方法会一起被调用。
(持续更新……)