使用java自带观察者模式的DOME(股票应用) 并给出单继承和Observable冲突的解决办法
2017-09-06 16:19
471 查看
这个DOME的应用场景是,当股票价格波动超过5%的时候通知所有投资者,如果超出了投资者的预设股价就买入,如果低于投资者的预设股价就卖出
首先给出Observable类,就是subject,我理解为就是管理通知类
//subject管理类 /** * Observable是一个实际的类,而JAVA是单继承模式,矛盾???(后面给出解决方案) */ public class Stock extends Observable { private static final float maxGainAndLoss = 0.05f; private float price; public Stock(float price) { this.price = price; } public void setPrice(float newPrice) { //在条件语句中抛出一个异常后面的程序不会执行 if (newPrice<0){ throw new IllegalArgumentException("Price can not be negative"); } float oldPrice = price; price = newPrice; float GainAndLoss = (newPrice - oldPrice)/oldPrice; if (abs(GainAndLoss)> maxGainAndLoss){ //在调用notifyObservers之前,必须调用setchange方法,设置状态发生了改变,否则不会触发通知 setChanged(); //通知所有的观察者,java封装的观察者是倒序通知观察者 notifyObservers(price); } } }
然后给出机构投资者和个人投资者两个观察者
/** * 个人投资者 */ public class PrivateInvestor implements Observer { private String name; private float maxPrice; private float minPrice; public PrivateInvestor(String name, float maxPrice, float minPrice,Stock stock) { this.name = name; this.maxPrice = maxPrice; this.minPrice = minPrice; stock.addObserver(this); } @Override public void update(Observable o, Object arg) { // System.out.println("个人先"); float price = (float) arg; if (price>maxPrice){ System.out.println("我是个人,该卖了!"); } if (price<minPrice){ System.out.println("我是个人,该买了!"); } } }
/** * 机构投资观察者 */ public class InstitutionalInvestor implements Observer { private String name; private float maxPrice; private float minPrice; public InstitutionalInvestor(String name, float maxPrice, float minPrice,Stock stock) { this.name = name; this.maxPrice = maxPrice; this.minPrice = minPrice; //将主题和观察者关联起来 stock.addObserver(this); } @Override public void update(Observable o, Object arg) { // System.out.println("机构先"); float price = (float) arg; if (price>maxPrice){ System.out.println("我是机构,该卖了!"); } if (price<minPrice){ System.out.println("我是机构,该买了!"); } } }
下面给出测试代码(这里使用是Android Studio的IDE)
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Stock stock = new Stock(19f); PrivateInvestor privateInvestor = new PrivateInvestor("王老六", 20f, 18.9f, stock); InstitutionalInvestor institutionalInvestor = new InstitutionalInvestor("平安证券", 20f, 18.5f, stock); stock.setPrice(18.0224f); stock.setPrice(20.923f); } }
给出测试结果
有个疑问,java自带的观察者应该是倒序通知,不过我这里却是正序通知?如有大神知晓请在评论解惑,谢谢!
下面我们再说一下单继承和observable鱼和熊掌不可兼得的事情,还是用一个DOME来说,简单明了
因为setChanged是个protected的方法,所以必须重写此方法,使其publicpublic class NewObservable extends Observable { @Override public synchronized void setChanged() { super.setChanged(); } }
现在只需要将上面的Dome中的stock类改成如下的类,然后使用NewObservable即可
public class PersonObservale extends Person{ int age; NewObservable newOB = new NewObservable(); }
相关文章推荐
- Websphere8.5自带jar包与应用jar包冲突的解决办法
- Rx_java(2) 使用java中的类(Observable与Observer)实现观察者模式
- net下多个应用之间的web.config冲突的解决办法(禁止继承)
- 使用java提供的Observable,实现观察者模式
- Java 语言使用 Observer/Observable 实现简单的观察者模式
- Java对观察者模式的支持——Observer和ObServable的使用
- GOF23设计模式之观察者模式的理解与实现2(使用java自带的观察者类和接口)
- Java 语言使用 Observer/Observable 实现简单的观察者模式
- Decorator模式中遭遇继承与聚合的冲突-Java基础-Java-编程开发
- velocity中使用ssi的#include指令冲突的解决办法
- 面向接口编程在Java web 三层架构的应用与使用工厂模式解决问题
- struts2使用拦截器时产生java.lang.IllegalStateException异常解决办法
- Caused by: java.lang.UnsupportedClassVersionError: Bad version number in .class file给出解决办法
- 关于使用super.getHibernateTemplate()中的方法报java.lang.NullPointerException的解决办法
- 默认库“library”与其他库的使用冲突;请使用 /NODEFAULTLIB:library LNK4098 的解决办法
- 面向接口编程在Java web 三层架构的应用与使用工厂模式解决问题
- Red5启动多个应用时端口冲突的解决办法
- 使用Apache JCS出现java.lang.NoClassDefFoundError: EDU/oswego/cs/dl/util/concurrent/Channel的解决办法
- 关于在DOMINO中使用JAVA调用JAVA受限制类的解决办法
- [java]webwork使用get提交方式乱码的解决办法