我们平常在做需求过程中,有的同学会按照面向对象的原则设计写出和框架代码一样高水平的代码,有的可能就是用面向过程的方式把需求给实现了,但是感觉不漂亮!也就是复用性比较差,修改一点地方容易导致别的地方出问题,扩展性也比较差, 我觉得我们要写出漂亮的代码应该考虑下面几个因素
1. 向对象的的基本特征:封装,继承,多态
2. 类之间的关系:实现、依赖、关联、聚合(has-a)、组合(contains-a);
3. 设计模式:23种设计模式;
4. 设计原则:SOLID (单一职责原则、开闭原则、里氏替换、接口隔离以及依赖反转)
5. 多看下经典学习案例,如《Agile Software Dvelopment Principles》(敏捷软件开发》中有个java薪水支付案例
简单解释下2个简单又重要的设计原则:单一职责原则和开闭原则
1)单一职责原则,一个合理的类,应该仅有一个引起它变化的原因,即单一职责,就是设计的这个类功能应该只有一个;消除耦合,减小因需求变化引起代码僵化。如下面的接口就应该抽到多个接口上
package com.cn.demo;
/**
* 购物行为
* @version 1.00
* @time 2019-06-06 23:22
*/
public interface ShoppingResource {
/**
* 下单
*/
void createOrder();
/**
* 修改库存
*/
void updateProductStock();
/**
* 发货
*/
void deliverGoods();
/**
* 获取用户信息
*/
void getUserInfo();
}
2) 开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。降低了程序各部分之间的耦合性,其适应性、灵活性、稳定性都比较好。当已有软件系统需要增加新的功能时,不需要对作为系统基础的抽象层进行修改,只需要在原有基础上附加新的模块就能实现所需要添加的功能。增加的新模块对原有的模块完全没有影响或影响很小,这样就无须为原有模块进行重新测试。 如下面的代码其实就是模板方法的列子
package jk.sj.templateMethod;
public abstract class Testcase {
public abstract void beforeTest();
public abstract void doTest();
public abstract void afterTest();
public final void test() {
beforeTest();
doTest();
afterTest();
}
}
public class ATestcase extends Testcase {
public void beforeTest() {
System.out.println("A: <before>");
}
public void doTest() {
System.out.println("A: <test>");
}
public void afterTest() {
System.out.println("A: <after>");
}
}
public class BTestcase extends Testcase {
@Override
public void beforeTest() {
System.out.println("B: <before>");
}
@Override
public void doTest() {
System.out.println("B: <test>");
}
@Override
public void afterTest() {
System.out.println("B: <after>");
}
}
public class TestTemplateMethod {
public static void main(String[] args) {
Testcase testcase = new ATestcase();
testcase.test();
}
}
对于设计原则不明白的可以参考下面的博客讲的比较清楚,但是建议熟记于心