Head First 设计模式 Design Pattern 1-2 Strategy, Observer
来源:互联网 发布:彩虹授权系统源码 编辑:程序博客网 时间:2024/06/10 17:50
Section 1 策略模式 Strategy
模式:经验复用, 软件开发是在不断调整改变的
设计原则 找出应用中需要变化的部分, 把他们从不需要变化的代码中独立(封装)出来;
>分开变化和不变的部分, 代码变化引起的影响小, 系统有弹性
设计原则 针对接口编程, 不是针对实现编程 >利用接口表示行为, 针对超类型(Supertype)编程, 利用多态
设计原则 多用组合Composition, 少用继承
>运行时候动态的改变行为, 使用setter >系统的维护和变化比前期开发需要更多的时间
策略模式 定义算法族, 封装, 让他们可以互换, 让算法的变化独立于使用算法的客户
//Strategy
class
FlyBehavior
// You can define more interface like Swim, Quack...
{
public
:
virtual
void
fly() = 0;
};
class
Duck
{
public
:
void
PerformFly() { mpFlyBehavior->fly();}
void
setFlyBehavior(FlyBehavior* pFlyBehavior) { mpFlyBehavior = pFlyBehavior;}
protected
:
FlyBehavior* mpFlyBehavior;
};
class
FlyWithWings :
public
FlyBehavior
{
public
:
virtual
void
fly();
//implement the way it flys
};
class
FlyNotAble :
public
FlyBehavior
{
public
:
virtual
void
fly();
};
class
MallardDuck :
public
Duck
{
public
:
MallardDuck() { mpFlyBehavior =
new
FlyWithWings();}
};
//Strategy
void
FlyWithWings::fly()
{
cout <<
"Fly with Wings\n"
<< endl;
}
void
FlyNotAble::fly()
{
cout <<
"I'm a little chicken\n"
<< endl;
}
int
main() {
//Strategy
MallardDuck duck;
duck.setFlyBehavior(
new
FlyNotAble());
duck.PerformFly();
return
0;
}
>类图 IS-A 是一个(继承 实线+三角 MallardDuck-Duck); HAS-A 有一个(实线+箭头 Duck-FlyBehavior); Implement(虚线+三角 FlyBehavior-FlyWithWings)
Summary
>OO基础 抽象, 封装, 多态, 继承 >OO原则 封装变化, 多组合少继承, 针对接口, 不针对实现编程
>要点 OO基础不足够设计OO系统, 需要设计模式; 良好OO设计 可复用 可扩充 可维护; 模式是历经验证的OO设计经验; 模式是解决方案; 模式是被发现的; 模式和原则, 基于软件的变化;
大多数的模式允许系统局部的改变独立于其他部分; 把变化的部分抽取封装; 模式是共享语言, 利于沟通
Encapsulate, Principles, Strategy, Vocabulary, Recur, Frameworks, Experience, Composition, Observer
---Section1 End---
Section 2 观察者模式 Observer
出版者Subject+订阅者Observer=观察者模式
>观察者模式定义了对象之间一对多的依赖, 当一个对象改变状态时, 所有的依赖者都会收到通知并自动更新.
Subejct是具有状态的对象, Observers使用这些状态, 依赖Subject来告诉他们状态什么时候改变
松耦合 Subject和Observers 改变主题或者观察者其中一方不会影响另一方
设计原则 为了交互对象之间的松耦合设计, 建立有弹性的OO系统
//Observer
class
IObserver
{
public
:
virtual
void
update(
int
temp) = 0;
};
class
ISubject
{
public
:
virtual
void
registerObservers(IObserver *Ob) = 0;
virtual
void
removeObservers(IObserver *Ob) = 0;
virtual
void
notifyObservers() = 0;
};
class
IDisplayElement
{
public
:
virtual
void
Display() = 0;
};
typedef
list<IObserver*> ObServerList;
class
WeatherData :
public
ISubject
{
public
:
WeatherData();
~WeatherData();
virtual
void
registerObservers(IObserver *Ob);
virtual
void
removeObservers(IObserver *Ob);
virtual
void
notifyObservers();
void
SetData(
int
temp);
void
DataChanged(){notifyObservers();}
private
:
ObServerList mObserverlist;
int
mTemp;
};
class
ConditionDisplay :
public
IObserver,
public
IDisplayElement
{
public
:
ConditionDisplay(ISubject *weatherData);
virtual
void
update(
int
temp);
virtual
void
Display();
private
:
ISubject* mpWeatherData;
int
mTemp;
};
//Observer
WeatherData::WeatherData()
: mTemp(100)
{
}
WeatherData::~WeatherData()
{
mObserverlist.clear();
}
void
WeatherData::registerObservers(IObserver *Ob)
{
mObserverlist.push_back(Ob);
}
void
WeatherData::removeObservers(IObserver *Ob)
{
ObServerList::iterator iter = mObserverlist.begin();
for
(; iter != mObserverlist.end(); iter++)
{
IObserver *Observer = *iter;
if
(Observer == Ob)
mObserverlist.
remove
(Ob);
}
}
void
WeatherData::notifyObservers()
{
ObServerList::iterator iter = mObserverlist.begin();
for
(; iter != mObserverlist.end(); iter++)
{
IObserver *Ob = *iter;
if
(Ob != NULL)
Ob->update(mTemp);
}
}
void
WeatherData::SetData(
int
data)
{
mTemp = data;
DataChanged();
}
ConditionDisplay::ConditionDisplay(ISubject *weatherData)
{
mpWeatherData = weatherData;
mpWeatherData->registerObservers(
this
);
}
void
ConditionDisplay::update(
int
temp)
{
mTemp = temp;
Display();
}
void
ConditionDisplay::Display()
{
cout <<
"Temperature is changed to "
<< mTemp << endl;
}
int
main() {
//Observer
WeatherData *weatherData =
new
WeatherData();
ConditionDisplay *conDisplay =
new
ConditionDisplay(weatherData);
weatherData->SetData(50);
return
0;
}
Java内置Observer
>setChanged()用来标记状态的变化, 调用notifyObserver()之前没有调用setChanged(),观察者不会被通知
import
java.util.Observable;
import
java.util.Observer;
public
class
WeatherData
extends
Observable {
private
float
temp;
public
WeatherData() {}
public
void
tempChanged(){
setChanged();
notifyObservers();
}
public
void
setTemp(
float
temp){
this
.temp = temp;
}
// Used for 'PULL'
public
float
getTemp(){
return
this
.temp;
}
}
import
java.util.Observable;
import
java.util.Observer;
import
DisplayElement.DisplayElement;
public
class
ConditionDisplay
implements
Observer, DisplayElement{
Observable observable;
private
float
temp;
public
ConditionDisplay(Observable observable) {
this
.observable = observable;
observable.addObserver(
this
);
}
public
void
update(Observable obs, Object arg){
if
(obs
instanceof
WeatherData){
WeatherData weatherData = (WeatherData)obs;
this
.temp = weatherData.getTemp();
display();
}
}
public
void
display(){
System.out.println(
"Condition"
+ temp);
}
/**
* @param args
*/
public
static
void
main(String[] args) {
WeatherData data =
new
WeatherData();
ConditionDisplay display =
new
ConditionDisplay(data);
float
o = data.getTemp();
float
t =
100
; data.setTemp(t);
if
(t - o >
10
){
data.tempChanged();
}
Object arg =
null
;
display.update(data, arg);
}
}
package
DisplayElement;
public
interface
DisplayElement {
public
void
display();
}
Summary
>OO原则 为交互对象之间的松耦合设计努力
>OO模式 在对象之间定义一对多的依赖, 当一个对象改变状态, 依赖它的对象都会收到通知, 自动更新
>要点 一对多; 主题/被观察者用一个共同的接口来更新观察者; 松耦合方式结合 LooseCoupling, 被观察者不知道观察者的细节; 可以实现推或拉 push pull; 多个观察者时, 无法依赖特定的通知顺序;
Java有多种观察者实现; Observable的局限; 定制并自己实现Observer; GUI框架大量使用观察者; JavaBeans, RMI;
No Order, Dependent, Interface, Listener-Publisher, Subject-Observer, Loose, Observable
---Section 2 End---
- Head First 设计模式 Design Pattern 1-2 Strategy, Observer
- Head First Design pattern Observer
- head first 设计模式之----Observer pattern
- 《Head First Design Pattern 》--设计模式 读书笔记
- 《Head First Design Pattern》读后感-----设计模式
- Head First 设计模式——策略模式(Strategy Pattern)
- Head First 设计模式之策略模式(Strategy Pattern)
- Head First 设计模式——观察者模式(Observer Pattern)
- Head First设计模式之观察者模式(Observer Pattern)
- Design Pattern 设计模式1 - Strategy 1
- Head First Design Pattern读书笔记一 Strategy Pattern
- Head First-策略模式(Strategy Pattern)
- OO设计模式(摘自:《Head First Design Pattern》)
- Head First 设计模式 Design Pattern 3-4 Decorator, Factory
- Head First 设计模式 Design Pattern 5-6 Singleton, Command
- Head First Design Pattern《深入浅出设计模式》读书笔记
- Head First Design Pattern读书笔记二 Observer Pattern
- 《Head First Design Patterns》笔记一:策略模式(Strategy Pattern)
- 【吐血写此博】Fedora14下eclipse进行android开发,ibus提示没有输入窗口的 解决办法
- 深度解析VC中的消息
- 手机视频监控系统开发系列文章
- jquery.validate使用攻略 - 1
- 移动流媒体技术及其应用发展方向
- Head First 设计模式 Design Pattern 1-2 Strategy, Observer
- SQL server之 存储过程
- socket编程实例讲解
- jquery.validate使用攻略 - 2
- 流媒体与视频监控开发相关博客文章系列收集
- 印度惊现1500元 iPhone 3GS 你要吗?
- jquery.validate使用攻略 - 3
- 手机流媒体技术简介
- Android系统默认设置