单一职责:
例子:
IPhone接口中有三个方法
dial --拨号
chat --通话
hangup --挂断电话
由于拨号 和 挂断电话是属于协议,而通话属于业务,所以对接口进行拆分
IConnector接口
dial --拨号
hangup --挂断电话
IDataTransfer接口
chat --通话
总结:对接口,有且仅有一个原因引起接口的变化。上面的例子协议 和 数据传输的变化都会引起IPhone接口的变化,所以要拆分
对类,尽力做到有且仅有一个原因引起类的变化,这个通常很难。
对方法,有且仅有一个原因引起方法的变化。
里氏替换原则
所有引用基类的地方必须能透明的使用其子类的对象;反之不行,子类出现的地方,父类未必能适应。
例子:士兵打枪,枪是父类,子类有多个实现。
4原则
a 子类必须完全实现父类的方法
b 子类可以有自己的个性
c 覆盖或实现父类的方法时,输入参数可以被放大
class Father {
public Collection doSomething(HashMap map){
System.out.println("父类被执行...");
return map.values();
}
public static void main(String[] args){
invoker();
}
public static void invoker(){
Son f = new Son();
HashMap map = new HashMap();
f.doSomething(map);
}
}
class Son extends Father{
public Collection doSomething(Map map){
System.out.println("子类被执行...");
return map.values();
}
}
d 覆盖或实现父类的方法时,输出结果可以被缩小。
依赖倒置原则
模块之间的依赖通过抽象发生,实现类之间不直接发生依赖,依赖通过接口或抽象类产生
接口或抽象类不依赖于实现类,实现类依赖于接口或抽象类
这就是所谓的面向接口编程
例子:司机开汽车,汽车是个接口,有多个实现类,司机调用接口即可。
依赖倒置三个写法:构造函数,set/get,接口中写
接口隔离原则
客户端不应该依赖它不需要的接口。从模块角度考虑,一个模块应该依赖他所需功能的接口,不需要的就不要写。
例子:女孩接口:脸蛋、身材、气质。 但是气质每个时代不同,所以需要隔离
女孩接口1:脸蛋、身材
女孩接口2:气质
然后用女孩实现接口1 和 接口2
迪米特法则
对调用的类知道的越少越好。最好只知道public方法,耦合性最低最好。
4个原则
a 一个类只和朋友交流,朋友指属性、方法的输入输出参数。
例子:老师 命令 体委 清点 学生。
老师只和体委交流,体委清点学生,学生的数量放在场景类中,而不是老师中。
b 一个类和朋友是有举例的不能太近,也不能太远。
例子:软件安装步骤
不能将所有的步骤暴露出来,将步骤封装在一个方法中,将这个方法暴露出来
c 是自己的就是自己的。一个类放在本类中可以,放在其他类中也可以,那么就放在本类中。
d 谨慎使用Serializable,在用RMI时,服务端和客户端修改要同步。
开闭原则
一个软件实体,如模块、类、抽象、方法,对扩展开放,对修改关闭.
例子:书店的例子
所有的书打9折,继承原来的类,重写价格方法,这样就是扩展而不是修改。
solid
s:单一职责----single responsibility principle
o:开闭原则----open closed principle
l:里氏替换----liskov substitution principle
l:迪米特 ----law of demeter
i:接口隔离----interface segregation principle
d:依赖倒置----dependence inverse principle
例子:
IPhone接口中有三个方法
dial --拨号
chat --通话
hangup --挂断电话
由于拨号 和 挂断电话是属于协议,而通话属于业务,所以对接口进行拆分
IConnector接口
dial --拨号
hangup --挂断电话
IDataTransfer接口
chat --通话
总结:对接口,有且仅有一个原因引起接口的变化。上面的例子协议 和 数据传输的变化都会引起IPhone接口的变化,所以要拆分
对类,尽力做到有且仅有一个原因引起类的变化,这个通常很难。
对方法,有且仅有一个原因引起方法的变化。
里氏替换原则
所有引用基类的地方必须能透明的使用其子类的对象;反之不行,子类出现的地方,父类未必能适应。
例子:士兵打枪,枪是父类,子类有多个实现。
4原则
a 子类必须完全实现父类的方法
b 子类可以有自己的个性
c 覆盖或实现父类的方法时,输入参数可以被放大
class Father {
public Collection doSomething(HashMap map){
System.out.println("父类被执行...");
return map.values();
}
public static void main(String[] args){
invoker();
}
public static void invoker(){
Son f = new Son();
HashMap map = new HashMap();
f.doSomething(map);
}
}
class Son extends Father{
public Collection doSomething(Map map){
System.out.println("子类被执行...");
return map.values();
}
}
d 覆盖或实现父类的方法时,输出结果可以被缩小。
依赖倒置原则
模块之间的依赖通过抽象发生,实现类之间不直接发生依赖,依赖通过接口或抽象类产生
接口或抽象类不依赖于实现类,实现类依赖于接口或抽象类
这就是所谓的面向接口编程
例子:司机开汽车,汽车是个接口,有多个实现类,司机调用接口即可。
依赖倒置三个写法:构造函数,set/get,接口中写
接口隔离原则
客户端不应该依赖它不需要的接口。从模块角度考虑,一个模块应该依赖他所需功能的接口,不需要的就不要写。
例子:女孩接口:脸蛋、身材、气质。 但是气质每个时代不同,所以需要隔离
女孩接口1:脸蛋、身材
女孩接口2:气质
然后用女孩实现接口1 和 接口2
迪米特法则
对调用的类知道的越少越好。最好只知道public方法,耦合性最低最好。
4个原则
a 一个类只和朋友交流,朋友指属性、方法的输入输出参数。
例子:老师 命令 体委 清点 学生。
老师只和体委交流,体委清点学生,学生的数量放在场景类中,而不是老师中。
b 一个类和朋友是有举例的不能太近,也不能太远。
例子:软件安装步骤
不能将所有的步骤暴露出来,将步骤封装在一个方法中,将这个方法暴露出来
c 是自己的就是自己的。一个类放在本类中可以,放在其他类中也可以,那么就放在本类中。
d 谨慎使用Serializable,在用RMI时,服务端和客户端修改要同步。
开闭原则
一个软件实体,如模块、类、抽象、方法,对扩展开放,对修改关闭.
例子:书店的例子
所有的书打9折,继承原来的类,重写价格方法,这样就是扩展而不是修改。
solid
s:单一职责----single responsibility principle
o:开闭原则----open closed principle
l:里氏替换----liskov substitution principle
l:迪米特 ----law of demeter
i:接口隔离----interface segregation principle
d:依赖倒置----dependence inverse principle