说明:由于项目涉及公司源码保密问题,个人上传了一份demo供大家参考和学习。
源码地址:https://gitee.com/Leelinkai/demo
1、项目概要
项目名称:商户报备系统
项目描述:满足商户各种产品(微信、支付宝、银联)等的报备功能,即每个产品支持商户创建,修改和查询的功能。
2、如何用设计模式做好程序设计
2.1 抽象工厂
首先大家读完项目描述,大家可以看到,微信支持创建,修改和查询,支付宝同理。此时大家可能会想到做封装什么之类的。但是大家也要思考什么类型的设计模式适合运用到实际项目中。同时我也重点标记了等字,也和产品沟通过,后续还会有QQ等产品的加入。到这里,肯定是找创建型设计模式,因此抽象工厂模式应运而生了。
既然决定使用抽象工厂模式,但是怎么去设计我们的框架接口目录呢?首先我要引入两个概念:产品族和产品等级结构。
- 产品族:是指由同一个工厂产生的,位于不同产品等级结构中的一组产品
- 产品等级结构:产品的继承结构。
由图可以等到,一个微信的产品的产品族分别是微信创建、微信修改和微信查询,一个查询的产品等级结构分别是微信查询、支付宝查询、银联查询。所以Y轴产品族这条线是一个具体工厂,工厂提供创建、修改和查询的功能。X轴是具体产品,分别支持微信、支付宝和银联。由上述分析,我们可以初步画出UML图。
由以上UML结构图,大家可以初步看出程序设计的基本框架了。一下是部分代码。
public interface CreateMerchant {
public void createMch();
}public class AlipayCreateMerchant implements CreateMerchant{
@Override
public void createMch() {
System.out.println("进行了支付宝商户创建");
}
}
public class UnipayCreateMerchant implements CreateMerchant{
@Override
public void createMch() {
System.out.println("进行了银联商户创建");}
}public class WeiXinCreateMerchant implements CreateMerchant{
@Override
public void createMch() {
System.out.println("进行了微信商户创建");
}
}public interface ModifyMerchant {
public void modifyMch();
}public class AlipayModifyMerchant implements ModifyMerchant{
@Override
public void modifyMch() {
System.out.println("进行了支付宝商户修改");
}
}public class UnipayModifyMerchant implements ModifyMerchant{
@Override
public void modifyMch() {
System.out.println("进行了银联商户修改");}
}public class WeiXinModifyMerchant implements ModifyMerchant{
@Override
public void modifyMch() {
System.out.println("进行了微信商户修改");}
}public interface FilingFactory {
public CreateMerchant createMerchant();
public ModifyMerchant modifyMerchant();
public QueryMerchant queryMerchant();
}
public class AlipayFilingFactory implements FilingFactory{
@Override
public CreateMerchant createMerchant() {
return new AlipayCreateMerchant();
}@Override
public ModifyMerchant modifyMerchant() {
return new AlipayModifyMerchant();
}@Override
public QueryMerchant queryMerchant() {
return new AlipayQueryMerchant();
}}
public class UnipayFilingFactory implements FilingFactory{
@Override
public CreateMerchant createMerchant() {
return new UnipayCreateMerchant();
}@Override
public ModifyMerchant modifyMerchant() {
return new UnipayModifyMerchant();
}@Override
public QueryMerchant queryMerchant() {
return new UnipayQueryMerchant();
}}
代码没有贴的很完整。但是基本思路的代码已在。假设需要新增个QQ产品报备,是不是只需要创建个QQFlingFactory 实现 FilingFactory报备具体工厂即可,同时工厂是独立的逻辑,不影响其他产品族的功能。
2.2 适配器模式
背景:系统是需要提供对外接口给到内部系统使用,功能是关于请求上游这一块。但是项目进展的过程中,本身计划将别的项目继承的请求上游这一块拷贝过来,因为那个项目只负责交易相关,本项目负责商户报备,各司其职。但是遇到的困难是交易的证书和报备的证书一致,导致如果迁移过来,意味这两套证书一致,需要维护两边。为了不改这边设计好的比较合理的代码结构,决定采用设计模式的适配器模式 。
public interface RequestChannel {
public void reqChannelCreate();public void reqChannelModify();
public void reqChannelQuery();
}public class RequestChannelAdapter implements RequestChannel{
private OtherItemRequestChannel otherItemRequestChannel; //其他项目接口
@Override
public void reqChannelCreate() {
System.out.println("这里是一堆请求渠道的创建商户逻辑");
otherItemRequestChannel.reqChannelCreate();
}
@Override
public void reqChannelModify() {
}
@Override
public void reqChannelQuery() {
}}
public class AlipayCreateMerchant implements CreateMerchant{
@Override
public void createMch() {
System.out.println("进行了支付宝商户创建");
RequestChannel RequestChannel = new RequestChannelAdapter();
RequestChannel.reqChannelCreate();
}
}
2.3 原型模式
原型模式又名克隆模式,其目的是创建一个属性一样对象通过复制出来,而不是每次去实例化。原型模式能减少JVM的开销,提高性能等。
项目背景:有个导入表读批量数据的操作,表的一行所有的字段都是一个对象。因此采用原因模式就可以将这些对象封装起来。注意,原型模式分为浅克隆金和深克隆。使用上的差一点大家可以自行去查阅,这里不做细说。
public class Merchant implements Cloneable{
private String name ;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
//注意这里JAVA提供的方法,创建新的对象的时候,只需要调此克隆方法,而不是实例化一个新的对象
public Merchant clone(){
Object object = null;
try{
object = super.clone();
return (Merchant)object;
}catch(CloneNotSupportedException e){
return null;
}
}
}
以上就是我这次报备系统中考虑的要素以及采用的设计模式,设计模式还有很多类型,需要我们不断去学习去积累,更好地将其应用到项目中,让项目更加规范和易于维护。