核心:对扩展开放,对修改关闭。
要想达到这样的效果,需要使用接口和抽象类。
子类继承父类时,除添加新的方法完成新增的功能外,不要重写父类的方法。
3. 合成复用原则概念:尽量使用组合或聚合等来实现,其次才考虑使用继承关系来实现。
通常分为继承复用和合成复用两种。
- 继承复用:
优点:简单和易实现
缺点:父类对子类是透明的,也称“白盒”复用;子类和父类的耦合度高;限制了复用的灵活性。合成复用:
优点:维持了类的复用性,也称“黑盒”复用;耦合度低;复用的灵活性高。
例如:Com是一个接口,接口中包含一个computer()方法。
public class Computer{ Com com; public void setCom(Com com){ this.com = com; } public void f(){ com.computer(); } }
- 多用组合,少用继承
设计一个类时,不让该类面向具体的类,而是面向抽象类或接口。
二、UML类图简介 1. 泛化关系泛化关系就是继承关系。
UML图:实线的起始端是子类,终点端是父类,终点端使用一个空心的三角形表示实线的结束。
A类中成员变量是用B类(接口)来声明的变量,那么A和B的关系是关联关系。
UML图:实线的起始端是A,实线的终点端是B,终点端使用一个指向B的方向箭头表示实线的结束。
A类中某个方法的参数是用B类(接口)来声明的变量或某个方法返回的数据类型是B类型的,就是依赖关系。
UML图:虚线的起始端是A,终点端是B,终点端使用一个指向B的方向箭头表示虚线的结束。
一个类实现了一个接口,就是实现关系。
UML图:虚线的起始端是类,终点端是接口,终点端使用一个空心的三角形表示虚线的结束。
单件类的构造方法访问权限是private.
单件类负责创建自己唯一的实例,并提供访问该实例的类方法.
- 构造方法私有化本类内部创建对象实例提供一个公有的静态方法,返回实例方法
当系统需要某个类只能有一个实例
四、工厂方法模式 1. 概念工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。
2. 模式的结构与使用- 抽象产品:抽象类或接口,定义具体产品必须实现的方法具体产品:类,实现抽象产品的方法构造者:一个接口或抽象类,定义一个工厂方法(抽象),该方法返回具体产品类的实例具体构造者:重写工厂方法,使该方法返回具体产品实例
- 用户需要一个类的子类的实例,但不希望与该类的子类形成耦合用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用
抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。
抽象工厂可以生产多个等级的产品。
- 抽象产品:一个抽象类或接口,定义具体产品必须实现的方法具体产品:类,实现抽象产品的方法抽象工厂:一个接口或抽象类,定义若干抽象方法(就是创建产品的方法,例如Coffee createCoffee();)具体工厂:具体工厂重写抽象工厂中的抽象方法,使该方法返回具体产品的实例
- 当需要创建的对象是一系列需要相互关联的产品族时,如电器工厂中的电视机、洗衣机等系统中有多个产品族,但每次只使用其中的某一族产品,如有人只喜欢穿某一个品牌的衣服和鞋
该模式的关键是将一个对象定义为原型,并为其提供复制自己的方法
2. 模式的结构与使用- 抽象原型:一个接口,定义对象复制自身的方法具体原型:实现接口,实现抽象原型中的方法
- 对象的创建非常复杂,可以使用原型模式性能和安全要求比较高
将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示
描述为主机与零件的关系
- 产品:定义变量,给变量创建set、get方法抽象建造者:定义产品中变量的方法,例如:buildxxx();定义返回产品对象的方法,也就是返回值类型为产品。具体建造者:实现抽象建造者中的方法指挥者:先声明一个抽象建造者的变量,声明返回值类型为产品的组装方法
- 创建的对象较为复杂,由多个部件构成对象的构建过程独立于创建该对象的类
让用户通过访问代理来访问想要访问的对象
比如:秘书是老板的代理,老板和秘书都有听电话的方法:herePhone()。
代理模式最常见的两种情况:远程代理和虚拟代理
- 抽象主题:接口,通过接口或抽象类声明真实主题和代理对象的方法实际主题:是实现抽象主题接口的类,是最终要引入的对象代理:是实现抽象主题接口的类
- 不希望用户直接访问该对象,而是提供一个特殊的对象控制访问需要很长的时间才能加载完成对象位于远程主机上
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)