/**
行為模式
Command模式是最讓我疑惑的一個模式
才感覺隱約掌握其大概原理
這樣才對自己實際編程有指導作用
規定很多的模式
Command定義
不少Command模式的代碼都是針對圖形界面的
我們在一個下拉菜單選擇一個命令時
將這些命令封裝成在一個類中
換句話說
就直接指向打開文檔的代碼
將這種直接關系拗斷
顯然這樣做的好處是符合封裝的特性
Command是將對行為進行封裝的典型模式
Factory是將創建進行封裝的模式
從Command模式
喜歡在不同類中增加第三者
如何使用?
具體的Command模式代碼各式各樣
下面事例是將命令封裝在一個Collection的List中
對象的特性消失了
典型的Command模式需要有一個接口
public interface Command {
public abstract void execute ( );
}
具體不同命令/請求代碼是實現接口Command
public class Engineer implements Command {
public void execute( ) {
//do Engineer
}
}
public class Programmer implements Command {
public void execute( ) {
//do programmer
}
}
public class Politician implements Command {
public void execute( ) {
//do Politician
}
}
按照通常做法
我們要將他們封裝起來
public class producer{
public static List produceRequests() {
List queue = new ArrayList();
queue
queue
queue
return queue;
}
}
這三個命令進入List中後
也可能無法分辨出誰是Engineer 誰是Programmer了
public class TestCommand {
public static void main(String[] args) {
List queue = Producer
for (Iterator it = erator(); it
//取出List中東東
// 他們至少是接口Command的
((Command)it
}
}
由此可見
面向接口編程
理解了上面的代碼的核心原理
有很多實現方法
使用Command模式的一個好理由還因為它能實現Undo功能
每個具體命令都可以記住它剛剛執行的動作
Command模式在界面設計中應用廣泛
/**
行為模式
State的定義: 不同的狀態
何時使用?
State模式在實際使用中比較多
如果針對狀態的這樣判斷切換反復出現
不只是根據狀態
這點在數據庫系統中出現頻率比較高
加上property屬性含義的字段
這種屬性的改變(切換)又是隨時可能發生的
是否使用?
在實際使用
這裡要闡述的是
一般的狀態判斷
if (which==
else if (which==
else if (which==
這是一個
if (state
else if (state
else if (state
這就是
再切換到
如果單純有上面一種將
也不一定需要使用State模式
但是如果又發生另外一個行為:將上面的切換方向反過來切換
請看下例:
public class Context{
private Color state=null;
public void push(){
//如果當前red狀態 就切換到blue
if (state==Color
//如果當前blue狀態 就切換到green
else if (state==Color
//如果當前black狀態 就切換到red
else if (state==Color
//如果當前green狀態 就切換到black
else if (state==Color
Sample sample=new Sample(state);
sample
}
public void pull(){
//與push狀態切換正好相反
if (state==Color
else if (state==Color
else if (state==Color
else if (state==Color
Sample
sample
}
}
在上例中
至此
另外注意:但就上例
State適合巨大的具體行為
這會增加子類的數目
例如: 銀行帳戶
例如: 經典的TcpConnection
並且反復轉換
例如:信箱POP帳號
每個狀態對應的行為應該是比較大的
例如:在工具箱挑選不同工具
如具體繪圖程序
如何使用
State需要兩種類型實體參與:
在state manager中有對狀態的切換動作
以上面的Context為例
第一步: 首先建立一個父類:
public abstract class State{
public abstract void handlepush(Context c);
public abstract void handlepull(Context c);
public abstract void getcolor();
}
父類中的方法要對應state manager中的開關行為
本例就是Context中
那麼在狀態父類中就要有具體處理這兩個動作:handlepush() handlepull();
同時還需要一個獲取push或pull結果的方法getcolor()
下面是具體子類的實現:
public class BlueState extends State{
public void handlepush(Context c){
//根據push方法
c
}
public void handlepull(Context c){
//根據pull方法
c
}
public abstract void getcolor(){ return (Color
}
同樣 其他狀態的子類實現如blue一樣
第二步: 要重新改寫State manager 也就是本例的Context:
public class Context{
private Sate state=null; //我們將原來的 Color state 改成了新建的State state;
//setState是用來改變state的狀態 使用setState實現狀態的切換
pulic void setState(State state){
this
}
public void push(){
//狀態的切換的細節部分
state
//因為sample要使用state中的一個切換結果
Sample sample=new Sample(state
sample
}
public void pull(){
state
Sample
sample
}
}
至此
以上只是相當簡單的一個實例
/**
行為模式
Strategy是屬於設計模式中 對象行為型模式
Stratrgy應用比較廣泛
可能有兩種實現方式
這裡以字符串替代為例
然後輸出
首先
public abstract class RepTempRule{
protected String oldString=
public void setOldString(String oldString){
this
}
protected String newString=
public String getNewString(){
return newString;
}
public abstract void replace() throws Exception;
}
在RepTempRule中 有一個抽象方法abstract需要繼承明確
我們現在有兩個字符替代方案
對應的類分別是RepTempRuleOne RepTempRuleTwo
public class RepTempRuleOne extends RepTempRule{
public void replace() throws Exception{
//replaceFirst是jdk
newString=oldString
System
}
}
public class RepTempRuleTwo extends RepTempRule{
public void replace() throws Exception{
newString=oldString
System
}
}
第二步
public class RepTempRuleSolve {
private RepTempRule strategy;
public RepTempRuleSolve(RepTempRule rule){
this
}
public String getNewContext(Site site
return strategy
}
public void changeAlgorithm(RepTempRule newAlgorithm) {
strategy = newAlgorithm;
}
}
調用如下:
public class test{
public void testReplace(){
//使用第一套替代方案
RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleSimple());
solver
//使用第二套
solver=new RepTempRuleSolve(new RepTempRuleTwo());
solver
}
}
我們達到了在運行期間
實際整個Strategy的核心部分就是抽象類的使用
Strategy和Factory有一定的類似
Factory重點是用來創建對象
Strategy適合下列場合:
/**
行為模式
Mediator定義:
用一個中介對象來封裝一系列關於對象交互行為
為何使用Mediator?
各個對象之間的交互操作非常多;每個對象的行為操作都依賴彼此對方
修改一個對象的行為
可以使各個對象間的耦合松散
使多對多的關系變成了一對多的關系
如何使用?
首先 有一個接口
public interface Mediator { }
Meiator具體實現
public class ConcreteMediator implements Mediator {
//假設當前有兩個成員
private ConcreteColleague
private ConcreteColleague
}
再看看另外一個參與者:成員
這種要求在Visitor Observer等模式中都是相同的
public class Colleague {
private Mediator mediator;
public Mediator getMediator() {
return mediator;
}
public void setMediator( Mediator mediator ) {
diator = mediator;
}
}
public class ConcreteColleague
public class ConcreteColleague
每個成員都必須知道Mediator
至此
大體框架也比較簡單
Mediator模式在事件驅動類應用中比較多
在聊天應用中
MVC是J
/**
行為模式
Interpreter定義:
定義語言的文法
Interpreter似乎使用面不是很廣
在實際應用中
首先要建立一個接口
public interface AbstractExpression {
void interpret( Context context );
}
再看看包含解釋器之外的一些全局信息
public interface Context { }
AbstractExpression的具體實現分兩種:終結符表達式和非終結符表達式:
public class TerminalExpression implements AbstractExpression {
public void interpret( Context context ) { }
}
對於文法中沒一條規則
public class NonterminalExpression implements AbstractExpression {
private AbstractExpression successor;
public void setSuccessor( AbstractExpression successor ) {
this
}
public AbstractExpression getSuccessor() {
return successor;
}
public void interpret( Context context ) { }
}
/**
行為模式
Visitor定義
作用於某個對象群中各個對象的操作
在Java中
為何使用Visitor?
Java的Collection(包括Vector和Hashtable)是我們最經常使用的技術
可是Collection好象是個黑色大染缸
那麼我們勢必要用If來判斷
Iterator iterator = erator()
while (iterator
Object o = iterator
if (o instanceof Collection)
messyPrintCollection((Collection)o);
else if (o instanceof String)
System
else if (o instanceof Float)
System
else
System
}
在上例中
很顯然
如何使用Visitor?
針對上例
public interface Visitor
{
public void visitCollection(Collection collection);
public void visitString(String string);
public void visitFloat(Float float);
}
在這個接口中
有了訪問者
我們要為這些Element定義一個可以接受訪問的接口(訪問和被訪問是互動的
只有訪問者
我們定義這個接口叫Visitable
public interface Visitable
{
public void accept(Visitor visitor);
}
好了
public class ConcreteElement implements Visitable
{
private String value;
public ConcreteElement(String string) {
value = string;
}
//定義accept的具體內容 這裡是很簡單的一句調用
public void accept(Visitor visitor) {
visitor
}
}
再看看訪問者的Concrete實現:
public class ConcreteVisitor implements Visitor
{
//在本方法中
public void visitCollection(Collection collection) {
Iterator iterator = erator()
while (iterator
Object o = iterator
if (o instanceof Visitable)
((Visitable)o)
}
public void visitString(String string) {
System
}
public void visitFloat(Float float) {
System
}
}
在上面的visitCollection我們實現了對Collection每個元素訪問
只使用了一個判斷語句
至此
使用Visitor模式的前提
對象群結構中(Collection) 中的對象類型很少改變
如上面中Visitor中的類型很少改變
還需要新的ConcreteElement
可見使用Visitor模式是有前提的
確保Visitor很少變化
如果Visitor也經常變化
不如在這些對象類中逐個定義操作
/**
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27375.html