前言
学习设计模式的同学第一个接触的大多数都是工厂模式,工厂模式又包括简单工厂,工厂方法,抽象工厂等模式。很多文章说的都不是很明白,而且抽象工厂也经常用不到。大多数情况下我们用到的是本文说的这种结合模式,跟工厂方法,抽象工厂不一样。具体看本文的例子。
目的
- 父类定义行为,具体的逻辑依靠子类实现,便于扩展
- 模版方法约定好共有的一段逻辑块,逻辑中的各个方法或者依靠子类具体实现,如果是通用的逻辑就在模版方法中实现。
代码实例
背景
vo开头的类都是GUI对象,也就VO对象,用于前端展示的对象。
networkdevice是后台的一个对象,这个对象包含了所有的设备的属性,是个大对象。并没有进行拆分。VO对象我们已经进行了抽象,进行了拆分,比如通用属性存储在Voserver中,变化的属性有子类承载,比如VoDMA,VoRpad。
我们期待通用的属性转换共用代码逻辑,不同的属性自定义转换类。
类图:
代码
转换类
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 10:33
* 4
*/
public abstract class Converter {
void converter(VoServer voServer, NetworkDevice networkDevice) {
networkDevice.setIp(voServer.getIp());
networkDevice.setName(voServer.getName());
converterCustomizeAttribute(voServer, networkDevice);
}
abstract void converterCustomizeAttribute(VoServer voServer, NetworkDevice networkDevice);
}
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 11:10
* 4
*/
public class DMAConveter extends Converter {
@Override
void converterCustomizeAttribute(VoServer voServer, NetworkDevice networkDevice) {
VoDma voDma = (VoDma) voServer;
networkDevice.setProxyAddress(voDma.getMcuAddrss());
}
}
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 11:10
* 4
*/
public class RpadConveter extends Converter {
@Override
void converterCustomizeAttribute(VoServer voServer, NetworkDevice networkDevice) {
VoRpad voRpad = (VoRpad) voServer;
networkDevice.setProxyAddress(voRpad.getProxyAddress());
networkDevice.setSipAddress(voRpad.getSipAddress());
}
}
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 10:42
* 4
*/
public class VoServer {
private String ip;
private String name;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 11:15
* 4
*/
public class VoDma extends VoServer {
private String mcuAddrss;
public String getMcuAddrss() {
return mcuAddrss;
}
public void setMcuAddrss(String mcuAddrss) {
this.mcuAddrss = mcuAddrss;
}
}
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 10:43
* 4
*/
public class VoRpad extends VoServer {
private String sipAddress;
private String proxyAddress;
public String getSipAddress() {
return sipAddress;
}
public void setSipAddress(String sipAddress) {
this.sipAddress = sipAddress;
}
public String getProxyAddress() {
return proxyAddress;
}
public void setProxyAddress(String proxyAddress) {
this.proxyAddress = proxyAddress;
}
}
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 10:45
* 4
*/
public class NetworkDevice {
private String name;
private String ip;
private String sipAddress;
private String proxyAddress;
private String mcuAddress;
public String getMcuAddress() {
return mcuAddress;
}
public void setMcuAddress(String mcuAddress) {
this.mcuAddress = mcuAddress;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getSipAddress() {
return sipAddress;
}
public void setSipAddress(String sipAddress) {
this.sipAddress = sipAddress;
}
public String getProxyAddress() {
return proxyAddress;
}
public void setProxyAddress(String proxyAddress) {
this.proxyAddress = proxyAddress;
}
}
package com.puhui.goosecard.api.utils;
/**
* 2 * @Author: kerry
* 3 * @Date: 2018/8/24 11:48
* 4
*/
public class Test {
public static void main(String[] args) {
Converter converter = new DMAConveter();
VoServer voServer = new VoDma();
NetworkDevice networkDevice = new NetworkDevice();
converter.converter(voServer, networkDevice);
}
}