这一章节我们引入设计原则:分离变化与不变的部分。
1.什么是不变的部分,什么是变化的部分?
(1)不变的部分
就像我们之前的增删改查,是一个比较固定的部分,每一个新的类继承都一样,只不过可能放到里面的参数不一样而已
(2)变化的部分
就像导入导出功能,它会根据不同的业务场景,然后有不同的需求
2.我们应该怎么做?
我们应该把不变的部分单独封装成一个类。
3.代码清单
在Base里面增加导入导出类的属性域
package com.raylee.designpattern.strategy.ch04; /** * 这个类是我们需要使用设计模式改进的原始类,也就是策略模式应用的初始环境。 * * @author raylee * @data 2016-03-16 * @version 1.0 */ public class BaseServiceImpl { private Export exportObject; private Import importObject; public BaseServiceImpl() { exportObject = new Export(); importObject = new Import(); } public Export getExportObject() { return exportObject; } public Import getImportObject() { return importObject; } public void add() { System.out.println("add a new object"); } public void update() { System.out.println("update object"); } public void query() { System.out.println("query and return a object"); } public void delete() { System.out.println("delete the object"); } }
导入导出实现类:
package com.raylee.designpattern.strategy.ch04; public class Import { public void importUser() { System.out.println("import users"); } public void importDept() { System.out.println("import depts"); } public void importCourse() { System.out.println("import courses"); } }
package com.raylee.designpattern.strategy.ch04; public class Export { public void exportUser() { System.out.println("export users"); } public void exportDept() { System.out.println("export depts"); } public void exportCourse() { System.out.println("export courses"); } }
在实现类里面调用导入导出的方法:
package com.raylee.designpattern.strategy.ch04; /** * @TODO 1 用于用户的增删改查 * @TODO 1.1 增加导入导出功能 * @author raylee * @date 2016年3月16日 * @version 1.1 */ public class UserServiceImpl extends BaseServiceImpl { public void exportUser() { getExportObject().exportUser(); } public void importUser() { getImportObject().importUser(); } }
package com.raylee.designpattern.strategy.ch04; /** * @TODO 1 用于部门的增删改查 * @TODO 1.1 增加导入导出功能 * @author raylee * @date 2016年3月16日 * @version 1.1 */ public class DeptServiceImpl extends BaseServiceImpl { public void exportDept() { getExportObject().exportDept(); } public void importDept() { getImportObject().importDept(); } }
package com.raylee.designpattern.strategy.ch04; /** * @TODO 1 用于课程的增删改查 * @TODO 1.1 增加导入导出功能 * * @author raylee * @date 2016年3月16日 * @version 1.1 */ public class CourseServiceImpl extends BaseServiceImpl { public void exportCourse() { getExportObject().exportCourse(); } public void importCourse() { getImportObject().importCourse(); } }
然后在Client里面测试导入导出
package com.raylee.designpattern.strategy.ch04; public class Client { // 对用户、部门、课程进行增删改查 public static void main(String[] args) { CourseServiceImpl courseServiceImpl = new CourseServiceImpl(); courseServiceImpl.importCourse(); courseServiceImpl.exportCourse(); UserServiceImpl userServiceImpl = new UserServiceImpl(); userServiceImpl.importUser(); userServiceImpl.exportUser(); DeptServiceImpl deptServiceImpl = new DeptServiceImpl(); deptServiceImpl.importDept(); deptServiceImpl.exportDept(); } }
输出:
import courses
export courses
import users
export users
import depts
export depts
4.问题
看上去上面的代码应该没什么问题,但是,如果我们增加的不单只是导入导出功能,而且还有其他的一些功能,我们还是需要改动原来的代码,可扩展性差。
总结:这一章节初步解决了需求变化的问题,但是还是存在不足。
目录:
我的github:https://github.com/raylee2015/designpattern
时间: 2024-10-31 23:52:25