文章目录 一、前言 二、观察者模式 三、实际案例 四、总结 设计模式一: 《用一个营销策略的实例说清楚策略模式的应用场景》 一、前言
文章目录
- 一、前言
- 二、观察者模式
- 三、实际案例
- 四、总结
设计模式一:
《用一个营销策略的实例说清楚策略模式的应用场景》
一、前言
- 在上篇文章中,我们用一个实例及其代码,演示了策略模式的应用场景;
- 本篇文章在继续用此方式探索观察者模式的使用场景。
二、观察者模式
- 观察者模式实际上表述得是两种对象的依赖关系:一种对象称之为目标对象(一般为一个),另一种对象称之为观察者对象(可以是一个也可以是多个),当目标对象的状态发生变化,则观察者对象都会收到通知。
三、实际案例
- 以下将举一个股票买卖的例子来说明观察者模式的应用
- 目标对象:包含股价、成交量、涨幅等状态信息,实现了注册、移除、通知投资者方法;当状态信息变更时将通知注册的全部投资者
* 观察者模式目标对象:股票
*
* @author zhuhuix
* @author 2021-03-22
*/
public class Stock {
// 投资者
private ArrayList<Investor> investors;
// 当前股价
private float price;
// 成交量
private float number;
// 涨幅
private float increase;
public Stock() {
investors = new ArrayList<>();
}
// 注册投资者
public void registerInvestor(Investor investor){
investors.add(investor);
}
// 移除投资者
public void removeInvestor(Investor investor){
investors.remove(investor);
}
// 如果如果通知投资者
public void notifyInvestors(){
for (int i = 0; i < this.investors.size(); i++) {
investors.get(i).dealStock(price,number,increase);
}
}
// 股票状态变化
public void stateChange(float price,float number,float increase) {
this.price = price;
this.number = number;
this.increase = increase;
// 通知投资者
notifyInvestors();
}
}
- 观察者接口:定义了设置股价、成交量、涨幅等信息,及买入、卖出股票方法
* 观察者模式:投资者
*
* @author zhuhuix
* @author 2021-03-22
*/
public interface Investor {
void buy(float stockNum);
// 设置投票卖出价格
void setSellPrice(float price);
// 设置成交量
void setSellNumber(float number);
// 设置涨幅
void setSellIncrease(float increase);
// 处理股票
void dealStock(float price,float number,float increase);
}
- 观察者对象:先后创建三类不同的投资者对象,根据不同的状态信息变化条件及目标设定值决定是否卖出股票
* 一类投资者: 股价超过设置价格就卖出
*/
public class Investor1 implements Investor {
private float stockNum;
private float sellPrice;
private float sellNumber;
private float sellIncrease;
@Override
public void buy(float stockNum) {
this.stockNum = stockNum;
}
@Override
public void setSellPrice(float price) {
this.sellPrice = price;
}
@Override
public void setSellNumber(float number) {
this.sellNumber = number;
}
@Override
public void setSellIncrease(float increase) {
this.sellIncrease = increase;
}
@Override
public void dealStock(float price, float number, float increase) {
if (price >= sellPrice && stockNum >0) {
System.out.println("当前股价"+price+"已超过设置价格"+sellPrice+",卖出"+stockNum+"股!!");
stockNum =0;
}
}
}
/**
* 二类投资者: 股价超过设置价格且成交量超过设置成交量才卖出
*/
public class Investor2 implements Investor {
private float stockNum;
private float sellPrice;
private float sellNumber;
private float sellIncrease;
@Override
public void buy(float stockNum) {
this.stockNum = stockNum;
}
@Override
public void setSellPrice(float price) {
this.sellPrice = price;
}
@Override
public void setSellNumber(float number) {
this.sellNumber = number;
}
@Override
public void setSellIncrease(float increase) {
this.sellIncrease = increase;
}
@Override
public void dealStock(float price, float number, float increase) {
if (price >= sellPrice && number >= sellNumber && stockNum >0) {
System.out.println("当前股价"+price+"已超过设置价格"+sellPrice +
",当前成交量"+number+"手已超过设置成交量"+sellNumber +"手"+"卖出"+stockNum+"股!!");
stockNum =0;
}
}
}
/**
* 三类投资者: 股价超过设置价格且成交量超过设置成交量且涨幅超过设置涨幅才卖出
*/
public class Investor3 implements Investor {
private float stockNum;
private float sellPrice;
private float sellNumber;
private float sellIncrease;
@Override
public void buy(float stockNum) {
this.stockNum = stockNum;
}
@Override
public void setSellPrice(float price) {
this.sellPrice = price;
}
@Override
public void setSellNumber(float number) {
this.sellNumber = number;
}
@Override
public void setSellIncrease(float increase) {
this.sellIncrease = increase;
}
@Override
public void dealStock(float price, float number, float increase) {
if (price >= sellPrice && number >= sellNumber && increase>=sellIncrease && stockNum >0) {
System.out.println("当前股价"+price+"已超过设置价格"+sellPrice +
",当前成交量"+number+"手已超过设置成交量"+sellNumber +
"手,当前涨幅"+increase+"%已超过设置涨幅"+sellIncrease +"%"+",卖出"+stockNum+"股!!");
stockNum =0 ;
}
}
}
- 业务主程序:通过创建股票、投资者对象、买入股票,再根据股票状态信息变更,依次卖出股票
* 观察者模式:股票卖出实例
*
* @author zhuhuix
* @date 2021-03-22
*/
public class Main {
public static void main(String[] args) {
// 创建股票
Stock stock = new Stock();
// 生成一类投资者
Investor1 investor1 = new Investor1();
investor1.buy(10000);
investor1.setSellPrice(10);
// 生成二类投资者
Investor2 investor2 = new Investor2();
investor2.buy(20000);
investor2.setSellPrice(10);
investor2.setSellNumber(500000);
// 生成三类投资者
Investor3 investor3 = new Investor3();
investor3.buy(30000);
investor3.setSellPrice(10);
investor3.setSellNumber(500000);
investor3.setSellIncrease(6);
// 依次注册
stock.registerInvestor(investor1);
stock.registerInvestor(investor2);
stock.registerInvestor(investor3);
// 模拟股票状态变化1
System.out.println("股票状态变化1:");
stock.stateChange(10,300000,1f);
// 模拟股票状态变化2
System.out.println("股票状态变化2:");
stock.stateChange(11,550000,3f);
// 模拟股票状态变化3
System.out.println("股票状态变化3:");
stock.stateChange(12,600000,6.5f);
}
}
- 主程序执行效果:
四、总结
- 观察者模式中的目标对象与观察者对象之间的交互用了一种松耦合的方式:在上面的例子中如果出现第四类投资者,那只要在目标对象中注册这类投资者,并实现卖出股票的新规则,就可以完成程序的扩展。
- 目标对象并不需要知道观察者对象的内部实现,只需要简单地将状态信息通知各个观察者即可,大大增加了程序的弹性。