设计模式七大原则
1、单一职责原则
提示:这里可以添加本文要记录的大概内容:
单一职责原则规定一个类只做一件事,否则类应该被拆分。
单一职责同样也适用于方法。一个方法应该尽可能做好一件事情。如果一个方法处理的事情太多,其颗粒度会变得很粗,不利于重用。
单一职责的优点:
a)降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
b)提高类的可读性。复杂性降低,自然其可读性会提高。
c)提高系统的可维护性。可读性提高,那自然更容易维护了。
d)变更引起的风险降低
2、接口隔离原则
客户端不应该依赖于它不需要的接口提示:不需要的接口指依赖的接口中有部分方法不需要的,但继承了接口就必须实现所有的方法
,即一个类对另一个类的依赖应该建立在最小的接口上;
类对类的依赖也类似,出现A依赖于B,但C只依赖于B的一部分,那么就可以把B拆分成C依赖的和C不依赖的,A调用时就调用拆分后的两个类;
3、依赖倒置原则
高层模块不应该依赖于底层模块,都应该依赖于抽象;
如:写一个接收消息的代码:
// 获取电子邮件信息的方法
class Email{
public String getInfo()
{
return "电子邮件信息:hello! ";
}
}
class Person{
//打印出邮件信息的方法
public void receive(Email email)
{
System.out.println(email.getInfo());
}
}
public static void main(String[] args){
Person person =new Person();
person.receive(new Email());
}
上面的写法会有一个缺点,只能用于接收电子邮件的信息,如果需要增加微信或其他获取信息的方法,那只能重复的写接收方法,代码重复过多;
解决方法:可以利用泛型(但不符合设计原则,且会有报错的风险)、也可以定义一个IReceiver接口让所有Email和微信等通讯的类都继承这个接口,他们里面都有相同的方法,在需要使用Email、微信等这些类的地方去全部使用IReceiver去替代,这样不管是邮件还是微信都可以使用这一个方法;
interface IReceiver{
public String getInfo();
}
// 获取电子邮件信息的方法
class Email implements IReceiver{
public String getInfo()
{
return "电子邮件信息:hello! ";
}
}
// 微信电子邮件信息的方法
class weChat implements IReceiver{
public String getInfo()
{
return "微信信息:hello! ";
}
}
class Person{
//打印出邮件信息的方法
public void receive(IReceiver receiver)
{
System.out.println(receiver.getInfo());
}
}
public static void main(String[] args){
Person person =new Person();
person.receive(new Email());
person.receive(new weChat());
}
底层模块尽量都要有 抽象类或接口,程序稳定性更好;所有变量的声明尽量使用接口或抽象类,减少更改的风险;
4、里氏替换原则
在继承时在子类中尽量不要重写父类的方法,可以通过聚合、组合、依赖来解决;
5、开闭原则(Open Closed Principle)
写一个绘制图形的方法,定义一个基类后期需要新增图形的话都是继承这个基类写新的图形类就可以,原本的代码可以完全不用动,提高了代码的可拓展性,保持了内部的不变性:
// 图形基类【抽象类】
abstract class shape{
int m_type;
@overide
public void draw();//抽象方法
}
// 三角形绘制
class Trangle extend shape{
Trangle (){
super.m_type=3;
}
@overide
public void draw(){
System.out.println("绘制三角形");
}
}
//用于绘图的类
class GraphicEditor{
public void drawshape(shape s){
s.draw();
}
}
public static void main(String[] args){
GraphicEditor graphicEditor=new GraphicEditor();
graphicEditor.drawshape(new Trangle());
}
6、迪米特法则(最少知道原则)
- 一个对象应该对其他对象保持最少的了解;
2)类与类关系越密切,耦合度越大; - 在A类中有 成员变量、方法参数、方法返回值为B,则A和B类之间存在耦合,如果A中只有局部变量B类那就不存在耦合(陌生类),最好不要出现陌生类;
总结:在类A中不要出现以局部变量出现的B类,降低不必要的耦合
7、合成复用原则
尽量使用合成、聚合的方式,而不是继承
合成:在类A需要使用类B中的方法时,在A中使用:B b=new B()的方式进行使用,把B组合到A中去。
聚合:在类A需要使用类B中的方法时,在A中使用:setB(B b){ B bb=b;}的方式进行使用,把B聚合到A中去。