常用设计模式实例分享

1 模板方法模式

 1.1 接口定义

/**
 * 高校管理
 */
public interface IUniversityManage {
    /**
     * 名称分析
     * @param name 学校名称
     * @return
     */
    String analysisName(String name);
}

1.2 抽象类实现接口,并定义抽象方法

@Service
public abstract class AbstractUniversity implements IUniversityManage{
    /**
     * 名称分析
     * @param name 学校名称
     * @return
     */
    @Override
    public String analysisName(String name) {
        //根据具体继承类调用对应的getAddress(..)
        return getAddress(name);
    }

    public abstract String getAddress(String name);
}

1.3 两个继承抽象类的方法

/**
 * 福大
 */
@Slf4j
@Service
public class FdUniversity1 extends AbstractUniversity {

    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理福州大学业务");
        return name+"地址:福州市静安区";
    }
}

/**
 * 厦大
 */
@Slf4j
@Service
public class XdUniversity1 extends AbstractUniversity{

    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理厦门大学业务");
        return name+"地址:厦门市思明区";
    }
}

1.4 根据不同场景调用不同的抽象方法实现类

/**
 * @author zhujianming
 * 模板方法模式
 */
@RequestMapping("/kindsmodels1")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController1 {

    /**
     * 模板方法模式:定义一个接口,由抽象类实现,同时抽象类中定义业务抽象方法,
     * 由业务类继承抽象类做业务逻辑细化,具体调用哪个业务逻辑,抽象类实现的接口会做动态判断
     */
    @PostMapping("/universityAddress/{universityName}")
    @ApiOperation(value = "查询高校地址【模板方法模式】", notes = "query student list")
    public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、厦门大学", defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
        AbstractUniversity university = null;
        if (universityName.equals("厦门大学")) {
            university = SpringBeanUtils.getBean(XdUniversity1.class);
        } else {
            university = SpringBeanUtils.getBean(FdUniversity1.class);
        }
        return university.analysisName(universityName);
    }
}

2 策略工厂模式

 2.1 接口定义

/**
 * 高校管理
 */
public interface IUniversityManage {
    /**
     * 通过高校名称获取地址
     * @param name 学校名称
     * @return
     */
    String getAddress(String name);
}

2.2 工厂类【添加工厂和获取工厂】

/**
 *  高校工厂
 */
public class UniversityFactory {
    public static Map<String,IUniversityManage> universityMap= Maps.newHashMap();

    /**
     * 通过工厂获取指定高校
     * @param name
     * @return
     */
    public static IUniversityManage getFactory(String name){
      return universityMap.get(name);
    }

    /**
     * 向工厂中添加指定高校
     * @param name
     * @param manage
     */
    public static void createFactory(String name,IUniversityManage manage){
        universityMap.put(name,manage);
    }

}

2.3  三个工厂

/**
 * 福大
 */
@Slf4j
@Service
public class FdUniversity2 implements IUniversityManage, InitializingBean {
    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理福州大学业务");
        return  name+"地址:福州市静安区";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        UniversityFactory.createFactory("福州大学",this);
    }
}

/**
 * 农大
 */
@Slf4j
@Service
public class NlUniversity2 implements IUniversityManage, InitializingBean {
    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理农林大学业务");
        return  name+"地址:福州市鼓楼区";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        UniversityFactory.createFactory("农林大学",this);
    }
}


/**
 * 厦大
 */
@Slf4j
@Service
public class XdUniversity2 implements IUniversityManage, InitializingBean {
    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理厦门大学业务");
        return name+"地址:厦门市思明区";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        UniversityFactory.createFactory("厦门大学",this);
    }
}

2.4 根据不同场景获取不同工厂,并实现对应方法

@RequestMapping("/kindsmodels2")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController2 {
    /**
     * 策略模式:同一接口有不同的实现类
     * 工厂模式:建立以bean匹配名称为name,bean对象为value的键值对map,
     * 实例化bean时通过afterPropertiesSet为map中添加值
     */
    @PostMapping("/universityAddress/{universityName}")
    @ApiOperation(value = "查询高校地址【策略模式+工厂模式】", notes = "query student list")
    public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、农林大学、厦门大学",defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
        IUniversityManage universityManage=UniversityFactory.getFactory(universityName);
        return universityManage.getAddress(universityName);
    }
}

3 策略模式

 3.1 接口定义

/**
 * 高校管理
 */
public interface IUniversityManage {
    /**
     * 获取地址
     * @param name 学校名称
     * @return
     */
    String getAddress(String name);
}

3.2 上下文,初始化所有策略

/**
 * 高校上下文
 */
@Service
public class UniversityContext {

    private final Map<String, IUniversityManage> strategyMap = new ConcurrentHashMap<>();

    /**
     * 构造函数按类型注入
     */
    public UniversityContext(Map<String, IUniversityManage> strategyMap) {
        strategyMap.forEach(this.strategyMap::put);
    }
 
    public IUniversityManage getContext(String beanName){
        return strategyMap.get(beanName)==null?null:strategyMap.get(beanName);
    }
 
}

3.3  两大策略

/**
 * 福大
 */
@Slf4j
@Service(value = "fd")
public class FdUniversity3 implements IUniversityManage {

    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理福州大学业务");
        return name+"地址:福州市静安区";
    }
}
/**
 * 厦大
 */
@Slf4j
@Service(value = "xd")
public class XdUniversity3 implements IUniversityManage {

    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理厦门大学业务");
        return name+"地址:厦门市思明区";
    }
}

3.4  根据不同场景获取指定上下文策略

/**
 * @author zhujianming
 * 策略模式
 */
@RequestMapping("/kindsmodels3")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController3 {

    @Autowired
    private UniversityContext context;

    /**
     *
     */
    @PostMapping("/universityAddress/{universityName}")
    @ApiOperation(value = "查询高校地址【策略模式】", notes = "query student list")
    public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、厦门大学", defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
        String beanName = null;
        if (universityName.equals("厦门大学")) {
            beanName = "xd";
        } else {
            beanName = "fd";
        }
        return context.getContext(beanName).getAddress(universityName);
    }
}

4 适配器模式

 4.1 接口定义

/**
 * 高校管理
 */
public interface IUniversityManage {
    /**
     * 获取地址
     * @param name 学校名称
     * @return
     */
    String getAddress(String name);

    boolean supports(IUniversityManage manage);
}

4.2 适配工具类

public class HandlerUtil {
    public static List<IUniversityManage> handlerAdapters = new ArrayList<IUniversityManage>();
    public static IUniversityManage getHandler(IUniversityManage manage) {
        for (IUniversityManage universityManage : handlerAdapters) {
            if (universityManage.supports(manage)) {
                return universityManage;
            }
        }
        return null;
    }
}

4.3 两大接口实现类

/**
 * 福大
 */
@Slf4j
@Service
public class FdUniversity4 implements IUniversityManage, InitializingBean {

    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理福州大学业务");
        return name+"地址:福州市静安区";
    }

    @Override
    public boolean supports(IUniversityManage manage) {
        return (manage instanceof FdUniversity4);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        HandlerUtil.handlerAdapters.add(this);
    }
}

/**
 * 厦大
 */
@Slf4j
@Service
public class XdUniversity4 implements IUniversityManage, InitializingBean {

    @Override
    public String getAddress(String name) {
        // 处理其他业务......
        log.info("处理厦门大学业务");
        return name+"地址:厦门市思明区";
    }

    @Override
    public boolean supports(IUniversityManage manage) {
        return (manage instanceof XdUniversity4);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        HandlerUtil.handlerAdapters.add(this);
    }
}

4.4 通过指定条件适配指定实现类

/**
 * @author zhujianming
 * 适配器模式
 */
@RequestMapping("/kindsmodels4")
@RestController
@Slf4j
@Api(tags = "设计模式")
public class MyController4 {

    @Autowired
    private XdUniversity4 xd;

    /**
     *
     */
    @PostMapping("/universityAddress/{universityName}")
    @ApiOperation(value = "查询高校地址【适配器模式】", notes = "query student list")
    public String universityAddress(@ApiParam(name = "universityName", value = "厦门大学、厦门大学", defaultValue = "厦门大学") @PathVariable("universityName") String universityName) {
        IUniversityManage manage=HandlerUtil.getHandler(xd);
        return manage.getAddress(universityName);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值