1 . 单一职责原则:一个类或者一个接口只负责一项功能,开发中尽量设计出功能单一的接口;
2. 依赖倒转原则: 高层模块不应该依赖低层模块的具体实现而是依赖其抽象,即面向接口编程;(多态特点的使用);例如:
interface Toy{ //商品接口
Double printPrice();//价格
void sale();//售卖
}
//具体实现类:男性商品
public class ManToy implements Toy{
@Override
public Double printPrice(){};
@Override
public void sale(){};
}
//具体实现类:女性商品
public class WmToy implements Toy{
@Override
public Double printPrice(){};
@Override
public void sale(){};
}
当顾客购买男性商品时 ,超市会提供男性商品saleManToy() ,如果某一天一位女性顾客要买女性商品,当然我们要生产出来女性商品,但是超市没有女性类商品的售卖权,所以就不能提供女性商品服务;怎么解决呢?
高层依赖低层具体实现:
如果一天顾客要买女性商品,超市要办理女性商品的售卖权;
如果一天顾客要买儿童商品,超市要办理儿童商品的售卖权;
......
public Market class {
//依赖具体实现类ManToy
public void saleManToy(ManToy toy){
toy.printPrice();
toy.sale();
...
}
//依赖具体实现类WmToy
public void saleManToy(WmToy toy){
toy.printPrice();
toy.sale();
...
}
}
public class Test {
public static void main(String[] arg0 ){
Market market = new Market ();
//通过具体实现类调用的效果
//购买男性商品
ManToy toy=new ManToy();
market.saleManToy(toy);
//购买女性商品
WmToy toy =new WmToy();
market.saleWmToy(toy);
//后续可能由于业务需求会增加儿童商品等
......
}
}
后来超市经理经过思考,办理了一个通用的商品经营牌照,只要是符合商品特性(实现Toy接口)都可以售卖。
public Market class {
//依赖低层抽象接口
public void saleToy (Toy toy){
toy.printPrice();
toy.sale();
...
}
}
//依赖注入有三种方式:参数声明注入,构造方法注入,setter注入,上述为接口参数声明注入。
构造方法注入:
public Market class {
private Toy toy;
public Market(Toy toy){
this.toy = toy;
}
public void saleToy (){
this.toy.printPrice();
this.toy.sale();
...
}
}
// setter注入:
public Market class {
private Toy toy;
public void setToy(Toy toy){
this.toy = toy;
}
public void saleToy (){
this.toy.printPrice();
this.toy.sale();
...
}
}
public class Test {
public static void main(String[] arg0 ){
ManToy toy=new ManToy();
WmToy toy =new WmToy();
//上述的三种注入方式实现如下:
//参数声明
Market market = new Market ();
market.saleToy(toy);
//构造方法注入
Market market = new Market (toy);
market.saleToy();
//setter注入
Market market = new Market ();
market.setToy(toy);
market.saleToy();
}
}
JDBC就是此设计原则的体现。
java提供接口规范,各类数据库厂商根据规范提供数据库驱动;
当高层业务变更需要更换数据库时,只需要把数据库驱动换一下就好了;
//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
Connection con = DriverManager.getConnection("url" , "username" , "password" ) ;
3. 开闭原则:程序对外扩展开放,对修改关闭;
- 迪米特法则:一个对象应该对其他对象保持最少的了解,尽量降低类与类之间的耦合度;
- 里氏代换原则:所有引用基类(父类)的地方必须能透明地使用其子类的对象;
- 接口隔离原则:客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上;
网友评论