大家好,我是听者,耳听心受的听,孙行者的者,感谢大家阅读我的文章。这一系列为大家讲解android的设计模式,今天先和大家谈谈面向对象设计的六大原则(以下简称“设计原则”),面向对象的三大特点封装、继承、多态,设计原则其实就是结合这些特点使程序容易维护和升级。其中抽象是设计原则最核心的方案。下面逐一了解一下各个设计原则:
1.单一职责原则:将线性相关性很强的函数、数据封装在一起,实现一个功能比较单一的模块。
2.开闭原则:软件中的对象(类、模块、函数)应该对于扩展是开放的,对于修改是封闭的。原则上只有出现先了bug时才应该修改原有代码,如果需求变更、系统升级不应该修改原来的代码,而是通过继承来修改对应的模块和功能。
3.里氏替换原则:所有引用基类的地方必须能透明的使用子类(核心是抽象,而抽象又依赖于继承)。
4.依赖倒置原则:模块之间的依赖,实现类之间不应该发生直接的依赖关系,其依赖关系是通过接口和抽象类发生的。
5.接口隔离原则:类间的依赖关系应该建立在最小的接口之上,接口的功能单一。
6.迪米特原则:一个对象应该对其他对象有最少的了解,并且只与直接的朋友耦合。
以上内容可能比较抽象,下面我们通过模拟网上购物给大家讲解一下设计原则,假设在网购的环节中我们只涉及到卖家、买家、快递三个环节。从单一职责原则我们来设计一下各个环节的只能。
卖家:接收订单,生产商品、通知快递员取货。
买家:下单。
快递:送货。
各个环节的职能明确以后,我们通过抽象来实现各个环节,保证以后的扩展(开闭原则):
买家设计类,不管是那类型的买家必须有下单功能(接口隔离原则),知道给哪家卖家下单就ok,不关心卖家怎么送货也就是不和快递直接耦合(迪米特原则):
public interface Customer { //客户
void placeOrder(Business business);
}
卖家设计类:遵循迪米特原则,卖家有三个功能,但是我们对于外界来说它只要可以下单就ok,我们根本不关心它是怎么生产商品和用什么快递发货。
public abstract class Business {
public void handleOrder(Customer customer) {//处理订单
Product product = production();
Deliver deliver = noticeDeliver();
deliver.sendProduct(product, customer);
}
protected abstract Product production();//生产商品
protected abstract Deliver noticeDeliver();//通知快递
}
快递设计类:快递只负责送货(接口隔离原则)
public interface Deliver {
void sendProduct(Product product, Customer customer);
}
产品设计类:
public class Product {
}
下面我们再设计一个购物的方法,运用里氏替换原则,该方法只要知道那个买家给那个卖家下单就ok了,不需要关系具体那种类型的卖家那种类型的买家
private void shopping(Customer customer,Business business) {
customer.placeOrder(business);
}
上面每一个类的设计都遵循依赖倒置原则每两个类之间的依赖关系是通过接口和抽象类发生的。
下面我们实现一个学生在JD购买了一部手机,通过SF送达。
手机继承于产品类:
public class Mobile extends Product {
public Mobile(int productId) {
System.out.println("JD为您私人订制了一部手机!!!");
}
}
学生继承于Customer:
public class Student implements Customer {
@Override
public void placeOrder(Business business) {
business.handleOrder( this);
}
}
SF继承于Deliver:
public class SF implements Deliver {
@Override
public void sendProduct(Product product, Customer customer) {
System.out.println("您收到了SF为你配送的宝贝!");
}
}
JD继承于Business:
public class JD extends Business {
@Override
protected Product production() {
return new Mobile();
}
@Override
protected Deliver noticeDeliver() {
return new SF();
}
}
有了这些类,我们调用shopping(new Student(),new JD());可以实现一个学生在JD购买了一部手机,通过SF送达。
好的,今天就介绍到这里,如果有什么疑问,欢迎加入 Android高级开发交流群 群号: 474440973,听者在北京等你!