java设计模式之------策略模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java设计模式之------策略模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6299字,纯文字阅读大概需要9分钟。
内容图文
![java设计模式之------策略模式](/upload/InfoBanner/zyjiaocheng/645/d029fa077740441384223e7c720f1f52.jpg)
一.概念
简单的说,策略模式就是要应对规则变化和新规则加入对程序带来的影响。对于面向对象程序设计如何实现呢?通过接口可以避免直接调用规则,从而使得业务变化不会对规则产生影响。同时,添加新规则也不会影响业务流程。
策略模式三个角色:
● 环境(Context)角色:持有一个Strategy的引用,这样任何具体的类只需实现策略接口即可传入环境角色,这样每个具体的策略都会new出一个环境角色来作为策略的载体,来实现不同的策略。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:继承或实现抽象策略角色,包装了相关的算法或行为。
二.代码标书策略模式的三个角色
1.环境角色
public class Context {
//持有一个具体策略的对象
private Strategy strategy;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}
/**
* 策略方法
*/
public void contextInterface(){
strategy.strategyInterface();
}
}
2.抽象策略接口类
public interface Strategy {
/**
* 策略方法
*/
public void strategyInterface();
}
3.具体策略类A
public class ConcreteStrategyA implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
4.具体策略类B
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
5.测试类
public class TestStratege {
public static void main (String[] args) {
ConcreteStrategyA concreteStrategyA = new ConcreteStrategyA();
Context contextA = new Context (concreteStrategyA);
contextA .contextInterface();
ConcreteStrategyB concreteStrategyB = new ConcreteStrategyB();
Context contextB = new Context (concreteStrategyB);
contextB .contextInterface();
}
}
三.实战应用场景
现有需要制造一批停车场,门诊,访客,旅馆数据,需要 经过数据的获取, 封装, 推送到rabbitmq中的三个过程.
1.环境角色编写(为一个线程类,每一种数据类型均对应一个环境线程)
public class DispatchThread<T> implements Runnable {
private DataHandle<T> dataHandle;
private RabbitMqParams params;
public DispatchThread(DataHandle<T> dataHandle, RabbitMqParams params){
this.dataHandle=dataHandle;
this.params=params;
}
@Override
public void run() {
T t;
while (true){
try {
t= dataHandle.getData();
t = dataHandle.format(t);
dataHandle.sendData(params,t);
Thread.sleep(20*1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.抽象策略类----策略接口(提供获取数据,封装数据,推送数据的接口模板)
public interface DataHandle<T> {
T getData();
T format(T t);
void sendData(RabbitMqParams params,T t);
}
3.具体策略类----实现策略接口
(1)停车场策略类---实现策略接口
public class PicParkDataHandle implements DataHandle<PicPark> {
private static final Logger logger = Logger.getLogger(PicParkDataHandle.class);
@Override
public PicPark getData() {
String json = "xxxxx";
PicPark picPark = JSON.parseObject(json, PicPark.class);
return picPark;
}
@Override
public PicPark format(PicPark picPark) {
picPark.setAreaName(picPark.getAreaName()+System.currentTimeMillis());
picPark.setCapTime(System.currentTimeMillis());
picPark.setCreateTime(System.currentTimeMillis());
picPark.setObjId(RandomPlateUtil.generateCarID());
picPark.setPlateNum(picPark.getObjId());
picPark.setRecordId(UUID.randomUUID().toString().replace("-",""));
return picPark;
}
@Override
public void sendData(RabbitMqParams params,PicPark picPark) {
RabbitProductClient client=new RabbitProductClient(params.getExchangName(),params.getHost(),params.getPort(),params.getUsername(),params.getPassword(),params.getExchangeType());
try {
client.sendMessage(JSON.toJSONString(picPark),params.getRouteKey());
logger.info("停车场数据发送成功: " + JSON.toJSONString(picPark));
} catch (Exception e) {
logger.error("发送停车场数据出错");
e.printStackTrace();
}
}
}
(2)旅馆策略类-----实现策略接口
public class HotelHandle implements DataHandle<Hotel> {
private static final Logger logger = Logger.getLogger(HotelHandle.class);
@Override
public Hotel getData() {
Hotel hotel=new Hotel();
hotel.setBirthday("1995-10-20");
hotel.setCapTime(System.currentTimeMillis());
hotel.setCardNo(IdCardGenerator.generate());
hotel.setCreateTime(System.currentTimeMillis());
hotel.setInTime(System.currentTimeMillis());
hotel.setLeaveTime(System.currentTimeMillis());
hotel.setName(NameGenerator.build());
hotel.setNation("汉族");
hotel.setNativePlace(RandomValue.getRoad());
hotel.setOutTime(System.currentTimeMillis());
hotel.setRoomno("304");
hotel.setSex("女");
return hotel;
}
@Override
public Hotel format(Hotel hotel) {
return hotel;
}
@Override
public void sendData(RabbitMqParams params, Hotel hotel) {
RabbitProductClient client=new RabbitProductClient(params.getExchangName(),params.getHost(),params.getPort(),params.getUsername(),params.getPassword(),params.getExchangeType());
try {
client.sendMessage(JSON.toJSONString(hotel),params.getRouteKey());
logger.info("旅馆数据发送成功: " + JSON.toJSONString(hotel));
} catch (Exception e) {
logger.error("发送旅馆数据出错");
e.printStackTrace();
}
}
}
4.使用环境角色装载不同的具体策略类(环境角色线程装载不同的真实策略角色完成不同数据类型的获取,封装,推送)
@Component
public class ProcessStarter implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
logger.info("模拟数据启动O(∩_∩)O~O(∩_∩)O~O(∩_∩)O~O(∩_∩)O~O(∩_∩)O~");
try {
//停车场数据
if (true) {
logger.info("picPark data product O(∩_∩)O~");
PicParkDataHandle handle=new PicParkDataHandle();
RabbitMqParams params=new RabbitMqParams();
params.rabbitInit();
params.setExchangName("xx_xx");
params.setRouteKey("xx.xx.2.*");
DispatchThread<PicPark> dispatchThread=new DispatchThread(handle,params);
Thread picThread = new Thread(dispatchThread);
picThread.setName("PicParkThread");
picThread.start();
ThreadMonitor.getInstance().addThreadMonitor(picThread);
}
if (true) {
logger.info("hotel data product O(∩_∩)O~");
HotelHandle handle=new HotelHandle();
RabbitMqParams params=new RabbitMqParams();
params.rabbitInit();
params.setExchangName("xx_xx");
params.setRouteKey("xx.xx.2");
DispatchThread<Hotel> dispatchThread=new DispatchThread(handle,params);
Thread hotelThread = new Thread(dispatchThread);
hotelThread.setName("HotelThread");
hotelThread.start();
ThreadMonitor.getInstance().addThreadMonitor(hotelThread);
}
logger.info("模拟数据启动程序启动完成//(≧▽≦)//~~//(≧▽≦)//~~//(≧▽≦)//~");
} catch (Exception e) {
logger.error("模拟数据启动程序启动时发生异常(╯﹏╰)(╯﹏╰)"+e.getMessage(),e);
}
}
}
内容总结
以上是互联网集市为您收集整理的java设计模式之------策略模式全部内容,希望文章能够帮你解决java设计模式之------策略模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。