当前位置: 首页 > news >正文

设计模式4-工厂模式策略模式

目录

一 工厂模式

1.1 思想

1.2 案例

1.2.1 接口

1.2.2 实现类

1.2.3 工厂类

1.2.4 调用

二 策略模式

2.1 思想

2.2 案例

2.2.1 接口

2.2.2 实现类

2.2.3 策略类

2.2.4 调用

三  工厂模式+策略模式

3.1 思想

3.2 案例

3.2.1 接口

3.2.2 实现类

3.2.3  定义Factory

3.2.4 调试

一 工厂模式

1.1 思想

* 1.定义一个接口
* 2.定义一个实现类
* 3.定义一个根据传入参数,产生对象的工厂类
* 4.通过工厂类调用具体对象的方法

1.2 案例

1.2.1 接口

public interface BankInfo {public  void payMoney();
}

1.2.2 实现类

public class BocBank implements BankInfo{@Overridepublic void payMoney() {System.out.println("中国银行取钱50元");}
}
public class IcbcBank implements BankInfo{@Overridepublic void payMoney() {System.out.println("工商银行银行取钱50元");}
}

1.2.3 工厂类

public class ObjectFactory {public BankInfo buildObjectInfo(String str){if (str == null){return null;}else if ("boc".equals(str)) {return new BocBank();}else if ("icbc".equals(str)) {return new IcbcBank();}else {return null;}}
}

1.2.4 调用

/*** @ClassName: TestFt* @Description: TODO* @Author: admin* 1.定义一个接口* 2.定义一个实现类* 3.定义一个根据传入参数,产生对象的工厂类* 4.通过工厂类调用具体对象的方法*** @Date: 2024/08/01 20:56:05 * @Version: V1.0**/
public class TestFt {public static void main(String[] args) {ObjectFactory objectFactory = new ObjectFactory();BankInfo bankInfoBank =  objectFactory.buildObjectInfo("icbc");bankInfoBank.payMoney();}
}

二 策略模式

2.1 思想

 1.定义一个策略接口,在接口中声明一个行为方法
* 2.定义多个策略实现类,并实现策略接口,重写行为方法,实现各自逻辑
* 3.定义一个context上下文,用于调用具体的策略方法,供客户端使用;通过new context的构造函数传入策略对象,然后通过此对象调用策略行为方法。

2.2 案例

2.2.1 接口

public interface BankInfo {public void payMoney(int a,int b);
}

2.2.2 实现类

public class BocBank implements BankInfo{@Overridepublic void payMoney(int a,int b) {System.out.println("中国银行,累加:"+(a+b));}
}
public class IcbcBank implements BankInfo{@Overridepublic void payMoney(int a, int b) {System.out.println("中国工商银行,扣减:"+(a-b));}
}

2.2.3 策略类

public class StaragePattern {private BankInfo bankInfo;public StaragePattern(BankInfo bankInfo) {this. bankInfo = bankInfo;}public  void  contextInfo(int a,int b){bankInfo.payMoney(a,b);}
}

2.2.4 调用

/*** @ClassName: TestS* @Description: TODO* 1.定义一个策略接口,在接口中声明一个行为方法* 2.定义多个策略实现类,并实现策略接口,重写行为方法,实现各自逻辑* 3.定义一个context上下文,用于调用具体的策略方法,供客户端使用;通过new context的构造函数传入策略对象,然后通过此对象调用策略行为方法。* https://zhuanlan.zhihu.com/p/680317010* @Author: admin* @Date: 2024/08/02 11:28:34 * @Version: V1.0**/
public class TestS {public static void main(String[] args) {
//        StaragePattern staragePattern = new StaragePattern(new BocBank());
//        staragePattern.contextInfo(30,20);}
}

三  工厂模式+策略模式

3.1 思想

1.定义接口实现InitializingBean,重写 void afterPropertiesSet(),在服务启动时候,自动执行子类中的afterPropertiesSet()方法。

3.2 案例

3.2.1 接口

public interface HandlerStrategyFactory  extends InitializingBean {void getCoca(String parameter);
}

3.2.2 实现类

@Component
public class CocaHandlerV2 implements HandlerStrategyFactory{@Overridepublic void getCoca(String parameter){System.out.println("我是可口可乐-策略+工厂 "+parameter);}@Overridepublic void afterPropertiesSet() throws Exception{//K          //VFactory.register("Coca",this);}
}
@Component
public class PepsiHandlerV2 implements HandlerStrategyFactory{@Overridepublic void getCoca(String parameter){System.out.println("我是百事可乐-策略+工厂 "+parameter);}@Overridepublic void afterPropertiesSet() throws Exception{Factory.register("Pepsi",this);}
}

3.2.3  定义Factory

public class Factory {private static Map<String, HandlerStrategyFactory> strategyMap = new ConcurrentHashMap<>();public static HandlerStrategyFactory getInvokeStrategy(String str){return strategyMap.get(str);}public static void register(String str ,HandlerStrategyFactory handler){System.out.println("str: "+str+"\t handler: "+handler);if (null == str || null == handler){return;}strategyMap.put(str,handler);}
}

3.2.4 调试

@SpringBootTest
public class DesignPatternTest
{/*** 策略+工厂V2*/@Testpublic void methodV2(){String parameter = "Coca";HandlerStrategyFactory invokeStrategy = Factory.getInvokeStrategy(parameter);invokeStrategy.getCoca(parameter);}
}

结果图:

http://www.lryc.cn/news/473210.html

相关文章:

  • 使用Html5基本标签实现“时空电影网”案例步骤及详细代码
  • Servlet 3.0 新特性全解
  • VUE组件学习 | 五、v-for组件
  • uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件
  • CentOS9 Stream上安装Edge浏览器
  • el-datepicker此刻按钮点击失效
  • VUE组件学习 | 六、v-if, v-else-if, v-else组件
  • 机器学习算法之回归算法
  • cordova android 内嵌vue页面 启动页之后白屏问题处理
  • 自研小程序-心情追忆
  • 【部署与升级-会议签到的web安装】
  • 【jvm】如何设置新生代和老年代的比例
  • 系统学习CFD,常见收敛问题、及如何与机器学习相结合
  • REST架构与实现
  • AI驱动的低代码未来:加速应用开发的智能解决方案
  • 快速上手 Rust——环境配置与项目初始化
  • 分布式事务Seata-AT模式
  • 编程知识概览
  • 基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!
  • 【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 8 (29.0.0) 优化
  • 全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响
  • Github 2024-10-24 Go开源项目日报 Top10
  • 中航资本:锂电行业现分化 优质产能仍然紧俏
  • 安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用
  • curl调用微信退款No required SSL certificate was sent
  • 进程守护SuperVisord内部的进程定时监测并重启
  • [面试题]ES6 Javascript
  • 四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
  • 解决电脑突然没有声音
  • ZFX数字股票全球品牌战略新闻发布会在香港盛大举行