Java面试题设计模式篇工厂方法结合模版方法

前言

学习设计模式的同学第一个接触的大多数都是工厂模式,工厂模式又包括简单工厂,工厂方法,抽象工厂等模式。很多文章说的都不是很明白,而且抽象工厂也经常用不到。大多数情况下我们用到的是本文说的这种结合模式,跟工厂方法,抽象工厂不一样。具体看本文的例子。

目的

  • 父类定义行为,具体的逻辑依靠子类实现,便于扩展
  • 模版方法约定好共有的一段逻辑块,逻辑中的各个方法或者依靠子类具体实现,如果是通用的逻辑就在模版方法中实现。

代码实例

背景

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);

    }
}

猜你喜欢

转载自blog.csdn.net/hanruikai/article/details/82015250