设计模式之观察者模式
生活:最近弄了台准系统游戏本,第一次接触准系统这个概念。说白就是品牌机的私生子,都是一个妈生的。然后私生子一般性价比都比原配的好。但私生子始终是私生子,是不会被品牌商认可的,没保修滴,要修只能到卖家那。哥屌丝一个,买电脑只能是想以最低的价格买好的电脑了。保修之类的,I dont care。最后,入手的本本不错,甚是喜欢。回归正题。
意图:当一个对象状态发生改变时,让依赖它的所有对象得到通知。
其实当你编程有一定能力看到这句话,你闭着眼都能把观察者模式写出来了。所谓设计模式不就是前人遇到问题解决方案的一个总结?
举例:我们玩游戏时,角色升级后,一般都会看都到屏幕有一个提示,用来告诉玩家,你的角色升级了(准备好money换装备没?亲)。不废话,下面我实现一个效果,角色升级后,宠物便会跳个舞。
代码:
先定义观察者接口
public interface LevelObserver {
public void update() ;
}
然后抽象被观察者
public abstract class Observered {
private List<LevelObserver> list=new ArrayList<LevelObserver>();
public void notice()
{
for(LevelObserver observer :list)
{
observer.update();
}
}
public List<LevelObserver> getList() {
return list;
}
public void setList(List<LevelObserver> list) {
this.list = list;
}
public void addLevelObserver(LevelObserver ob)
{
list.add(ob);
}
public void removeLevelObserver(LevelObserver ob)
{
list.remove(ob);
}
}
看过一些别人的代码,好像一般都是抽象类实现主要逻辑。这里也是实现通知被观察者的逻辑。
然后便是宠物对象实现观察者接口
public class Monster implements LevelObserver{
private String name ;
public Monster(String name) {
// TODO Auto-generated constructor stub
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println(name+"兴奋的跳起舞来");
}
}
接着,被观察者的具体实现
public class Role extends Observered{
private int level;
private String name;
public Role(String name) {
// TODO Auto-generated constructor stub
this.name=name;
}
public void uplevel()
{
this.level++;
System.out.println(this.name+"等级提升1");
notice();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
好了,最后丢到主线程执行
public class Main {
/**
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Role role=new Role("小明");
Monster monster=new Monster("巨兽");
role.addLevelObserver(monster);
role.uplevel();
}
}
执行结果:
小明等级提升1
巨兽兴奋的跳起舞来
就这样,一个简单的观察者模式完成。
题外话:这段时间主要是学习设计模式,先不说会用,起码会写先。工作后,感觉基础才是重要的,其他一些神马框架神马语言,不过是个工具。内在的东西才是硬道理。