Java的策略模式
策略模式也是我们经常使用的模式,它的定义如下:将可变的部分从程序中抽象分离出来成为算法接口,在该部分下分别封装一系列算法实现并使它们可以相互替换。
举个例子,我们现在有三种支付方式:支付宝支付,微信支付,银行App支付。假设我们要做一个软件,每个软件都有各自对应的支付方式,在这种情况下,我们就可以把支付方式这个策略分离出来,就可以很方便的在写软件类时使用使用想使用的策略方式。
把策略做成一个接口,然后把软件做成抽象类,就可以通过继承来很方便的对各个具体软件类和具体策略类进行编写。实现代码如下:
PayStrategy.java
//支付策略接口
public interface PayStrategy {
void pay();
} WeiXin.java
public class WeiXin implements PayStrategy {
//微信支付类
@Override
public void pay() {
// TODO Auto-generated method stub
System.out.println("---请使用微信支付---");
} } Zhifubao.java
public class Zhifubao implements PayStrategy {
//支付宝支付类
@Override
public void pay() {
// TODO Auto-generated method stub
System.out.println("---请使用支付宝支付---"); } }
BanApp.java
public class BankApp implements PayStrategy {
//银行App支付类
@Override
public void pay() {
// TODO Auto-generated method stub
System.out.println("---请使用银行app支付---");
} }
再使用一个软件抽象类,和需要的具体软件类。
PaySoftware.java
//软件抽象类
public abstract class Paysoftware {
//使用组合的方式来实现策略模式
private PayStrategy strategy; public void setStrategy(PayStrategy strategy) {
this.strategy = strategy;
} public void payInterface() {
strategy.pay();
} //没有使用策略模式的方法
public abstract void sofwareStatement();
} SoftwareA.java
public class SoftwareA extends Paysoftware {
public SoftwareA() {
// TODO Auto-generated constructor stub
super();
super.setStrategy(new Zhifubao());
}
public void sofwareStatement() {
System.out.println("我是软件A");
} } SoftwareB.java
public class SoftWareB extends Paysoftware { public SoftWareB() {
// TODO Auto-generated constructor stub
super();
super.setStrategy(new BankApp());
}
public void sofwareStatement() {
System.out.println("我是软件B");
} }
再定义一个测试类
TestDrive.java
public class TestDrive { public static void main(String[] args) {
// TODO Auto-generated method stub
Paysoftware softwarea=new SoftwareA();
softwarea.sofwareStatement();
softwarea.payInterface(); } }
结果如下:
我是软件A
---请使用支付宝支付---
这样我们就实现了策略模式。
Java的策略模式的更多相关文章
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- JAVA 设计模式 策略模式
用途 Title 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式是一种行为型模式. 结构
- 我的Java设计模式-策略模式
今天给大家说说田忌赛马的故事.如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的,其中赛马是最火爆的.一天,孙膑看到田忌像个死鸡似的就知道肯定赛马又输给了齐威王,立马 ...
- Java设计模式—策略模式
1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Define a family of algorithms,e ...
- Java设计模式-策略模式详解
前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...
- java使用策略模式代替if/else
平时在开发中避免不了使用大量的if else语句,但过多层的if else对于性能有很大的开销,类似如下代码 public class MainStart { public static void m ...
- Java 关于策略模式+简单工厂模式下的思考
导读 最近在做公司一个消息网关的服务,包括:短信.微信.邮件等,所有请求通过一个入口,方便接口的管理(记录日志.接口限流白名单啥的).如何写这个接口呢,还有为了以后扩展,对接过短信.微信.公众号的童鞋 ...
- Java 设计模式--策略模式,枚举+工厂方法实现
如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...
- java设计模式--策略模式
策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 本文地址:http:// ...
随机推荐
- Quartz是一个任务调度
这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作.由于没有用过Quartz是一个任务调度,一直使用这个办法,今天通过同事提点,从 ...
- Linux系统软件包的管理(4)
虽然使用源码编译安装可以具有提高速度个性化的定制等优点,但对于 Linux发行商来说,则不容易管理软件包,毕竟不是每个人都会进行源码编译的,如果能够将软件预先在相同的硬体与系统上面编译好在发布的话,不 ...
- MariaDB 备份与日志管理(13)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- 大脸猫讲逆向之ARM汇编中PC寄存器详解
i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...
- 【sping揭秘】3、Spring容器中bean默认是保持一个实例
Spring容器中bean默认是保持一个实例 这里做一个测试,基础代码 package cn.cutter.start.provider; import org.springframework.con ...
- 【原创】SQL Server 性能调优读书笔记
CPU 100%: 有时可能是硬盘性能不足,或者内存容量不够,让CPU一直忙于I/O. 导致性能问题的一些因素: 用户习惯:在运行尖峰时刻做一些不必做但消耗资源的事情,如之行数据库完整备份,如在服务器 ...
- Spring Boot启动流程
基础准备 1,BeanPostProcessor:这个接口的作用在于对于新构造的实例可以做一些自定义的修改.比如如何构造.属性值的修改.构造器的选择等等 2,BeanFactoryPostProces ...
- python使用(二)
Python中的集合类型. 1.list_option.py 2.listsplit_option.py 3. dic_option.py 4.iter_option.py 1.list_option ...
- SQL SERVICE中的锁
SQL SERVICE中的几个锁 SELECT * FROM dbo.TableName WITH (NOLOCK) --不加任何锁的读,脏读SELECT * FROM dbo.TableName W ...
- 使用Java客户端对Redis进行操作
一.背景 上篇文章我们介绍了如何在centos7下面进行安装单机版redis以及redis集群.这篇文章,我们来聊一聊如何使用java客户端来进行操作redis.我们知道redis的java客户端有很 ...