这一章节我们来讨论一下怎么解决上一章节扩展性差的问题。
1.解决方案
面向接口编程
2.思路
使用java的多态性,动态的设置导入导出的行为
3.代码清单
在Base里面使用导入导出的接口,然后增加一个通用的导出导入方法,下面的实现中,我们只需要设置不同的导入导出行为,即可通过导入导出方法来实现不同的导入导出结果。
package com.raylee.designpattern.strategy.ch05;
/**
* 1.0 这个类是我们需要使用设计模式改进的原始类,也就是策略模式应用的初始环境。
* 1.1 使用导入导出的接口
*
* @author raylee
* @data 2016-03-16
* @version 1.1
*/
public class BaseServiceImpl {
private Export exportObject;
private Import importObject;
public void setExportObject(Export exportObject) {
this.exportObject = exportObject;
}
public void setImportObject(Import importObject) {
this.importObject = 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");
}
public void exportObject() {
exportObject.exportObject();
}
public void importObject() {
importObject.importObject();
}
}
package com.raylee.designpattern.strategy.ch05;
/**
* @TODO 1.0 用于用户的增删改查
* @author raylee
* @date 2016年3月16日
* @version 1.0
*/
public class UserServiceImpl extends BaseServiceImpl {
}
package com.raylee.designpattern.strategy.ch05;
/**
* @TODO 1.0 用于部门的增删改查
* @author raylee
* @date 2016年3月16日
* @version 1.0
*/
public class DeptServiceImpl extends BaseServiceImpl {
}
package com.raylee.designpattern.strategy.ch05;
/**
* @TODO 1.0 用于课程的增删改查
*
* @author raylee
* @date 2016年3月16日
* @version 1.0
*/
public class CourseServiceImpl extends BaseServiceImpl {
}
package com.raylee.designpattern.strategy.ch05;
public interface Import {
public void importObject();
}
package com.raylee.designpattern.strategy.ch05;
public interface Export {
public void exportObject();
}
package com.raylee.designpattern.strategy.ch05;
public class ImportUser implements Import {
public void importObject() {
importUser();
}
private void importUser() {
System.out.println("import users");
}
}
package com.raylee.designpattern.strategy.ch05;
public class ImportDept implements Import {
public void importObject() {
importDept();
}
private void importDept() {
System.out.println("import depts");
}
}
package com.raylee.designpattern.strategy.ch05;
public class ImportCourse implements Import {
public void importObject() {
importCourse();
}
private void importCourse() {
System.out.println("import courses");
}
}
package com.raylee.designpattern.strategy.ch05;
public class ExportUser implements Export {
public void exportObject() {
exportUser();
}
private void exportUser() {
System.out.println("export users");
}
}
package com.raylee.designpattern.strategy.ch05;
public class ExportDept implements Export {
public void exportObject() {
exportDept();
}
private void exportDept() {
System.out.println("export depts");
}
}
package com.raylee.designpattern.strategy.ch05;
public class ExportCourse implements Export {
public void exportObject() {
exportCourse();
}
private void exportCourse() {
System.out.println("export courses");
}
}
package com.raylee.designpattern.strategy.ch05;
public class Client {
// 对用户、部门、课程进行增删改查
public static void main(String[] args) {
CourseServiceImpl courseServiceImpl = new CourseServiceImpl();
courseServiceImpl.setExportObject(new ExportCourse());
courseServiceImpl.setImportObject(new ImportUser());
courseServiceImpl.importObject();
courseServiceImpl.exportObject();
UserServiceImpl userServiceImpl = new UserServiceImpl();
userServiceImpl.setExportObject(new ExportUser());
userServiceImpl.setImportObject(new ImportUser());
userServiceImpl.importObject();
userServiceImpl.exportObject();
DeptServiceImpl deptServiceImpl = new DeptServiceImpl();
deptServiceImpl.setExportObject(new ExportDept());
deptServiceImpl.setImportObject(new ImportDept());
deptServiceImpl.importObject();
deptServiceImpl.exportObject();
}
}
import users
export courses
import users
export users
import depts
export depts
4.总结:
其实无论是分离原则还是面向接口编程的原则,都是策略设计模式的一部分,先分离后面向接口,这就是使用策略设计模式的过程。
因此,策略设计模式的概念是定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
5.优点与缺点
优点:可扩展性好。当我们再次增加新的模块的导出时,不需要改动原来的代码,只需要增加一个新的导入导出行为类即可,然后client端通过设置行为的不同来确定不同的导入导出结果。
缺点:代码的增加
因此,判断使用设计模式的标准,笔者认为,就是该功能的变化的程度会是多少?变化多的,像上面的导入导出,每一个模块的结果都是不一样的,这个时候使用设计模式,就是比较切当的,如果变化较少,类似上面的增删改查,就没什么必要了,因为增加了不少的代码量。
6.更多的使用场景
不同的查找、排序方法,当然如果硬要分的话,上面的增删改查也可以分出几个来,因为现在市面上的数据库不一样,我们可以根据不同的数据库来区分存储行为
总结:这一章节展现了策略模式的另一个重要的过程-面向接口编程。
目录:http://blog.csdn.net/raylee2007/article/details/50951190
我的github:https://github.com/raylee2015/designpattern