锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍛戒護鎺ュ彛錛?br />
public interface Command {
public void execute();
}
public class LightOffCommand implements Command {
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
public void execute() {
light.off();
}
}
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
public class Light {
public Light() {
}
public void on() {
System.out.println("Light is on");
}
public void off() {
System.out.println("Light is off");
}
}
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}
public void setCommand(Command command) {
slot = command;
}
public void buttonWasPressed() {
slot.execute();
}
}
public class RemoteControlTest {
public static void main(String[] args) {
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
}
1銆?鍒嗗竷鐧昏緇熶竴鎵ц錛?br />
鍦ㄤ綔紼嬪簭鏃訛紝緇忓父紕板埌涓浜涢渶姹傦紝鍏堟敞鍐屼竴浜涙搷浣滐紝騫朵笉椹笂鎵ц錛岀瓑鏈緇堢‘瀹氬悗緇熶竴鎵ц銆傚涓涓叿浣撶殑渚嬪瓙:鐢ㄦ埛瀹氬埗鑷繁鐨勬姤琛紝鍙互璁㈤槄楗鹼紝鏌憋紝鎶樼嚎錛屾洸綰垮浘錛屽鎴烽夋嫨鐩稿簲鐨勬姤琛ㄧ粍鍚堬紝榪欐牱瀵瑰簲涓涓懡浠ら泦鍚堬紝鍦ㄦ病紜畾涔嬪墠鐢ㄦ埛鍙互澧炲垹榪欎簺鎶ヨ〃錛堝懡浠わ級錛岀瓑鏈緇堢‘瀹氱粺涓浜ょ粰璋冪敤鑰呮牴鎹懡浠ゆ墽琛岋紝鐢熸垚緇勫悎鎶ヨ〃銆傚疄鐜頒簡鍛戒護鍒嗗竷鎻愬嚭錛岀‘瀹氬悗緇熶竴鎵ц鐨勫姛鑳姐?br />
2銆嬪艦濡傛祦姘寸嚎鎿嶄綔錛氳繕鏄嚭涔︾殑渚嬪瓙
//鍏堟槸涓鏈┖鐧界殑涔︼細
Book book = new Book();
//鎵懼嚑涓綔鑰?br />
Author author1 錛?new Author();
Author author2 錛?new Author();
//鎶婂啓1錛?绔犵殑鍚嶇被鍒嗗埆緇欒繖涓や釜浣滆?br />
Command writeCommand = new Write1Command (author1錛宐ook);
Command writeCommand = new Write2Command (author2錛宐ook);
List commands 錛?new List ();
Commands.add(writeCommand);
//璋冪敤鑰?br />
Invoker invoker = new invoker();
Invoker.setCommands(commands);
//嫻佹按鍐欎功
invoker.action()
瀹為檯涓婂湪aciton榪欎竴鏂規硶涓紝invoker鎸夌収鍛戒護錛岃涓や釜浣滆呮祦姘村啓浣滆繖鏈功銆傦紙綾諱技涓涓功鐨勬祦姘寸嚎鍔犲伐宸ュ巶錛?br />
榪欐牱鎴戜滑鐨勪功灝辮嫻佹按鍔犲伐鎴愬姛錛堝綋鐒惰繖鏈功鍙湁涓ょ珷錛?br />
榪欐牱灝辯粰浜嗘垜浠竴縐嶇郴緇熻璁$殑妗嗘灦錛?br />
妯″瀷錛嬪伐鍏鳳紜鍛戒護
瀹㈡埛绔駭鐢熷懡浠わ紝鍛戒護璋冪敤宸ュ叿鎿嶄綔妯″瀷銆?br />
Book 鐩稿綋浜庢ā鍨?br />
Author 鐩稿綋浜庡拰澶氬伐鍏風被涓殑涓涓?br />
Command 鍛戒護
3銆嬬郴緇熼渶瑕佹敮鎸佸懡浠ょ殑鎾ゆ秷(undo)銆傛彁渚況edo()鏂規硶銆愬鏄撴墿灞曘?br />
鎴戜滑鍙互鍜屽鏄撶殑鍔犲叆undo鍜宺edo錛岃繖涓笉闅劇悊瑙?br />
4銆嬪湪Invoker涓垜浠彲浠ュ疄鐜拌窡韙紝鍜屾棩蹇椼?br />
5銆嬪綋緋葷粺闇瑕佷負鏌愰」澶嶅埗澧炲姞褰㈢殑鍔熻兘鐨勬椂鍊欙紝鍛戒護妯″紡浣挎柊鐨勫姛鑳斤紙琛ㄧ幇涓轟竴縐嶅懡浠わ級寰堝鏄撳湴琚姞鍏ュ埌鏈嶅姟縐嶉噷銆?br />
鍛戒護鑱旂郴浜嗗伐鍏風被鍗蟲墽琛岀被鍜岀郴緇熼昏緫錛?br />
綆鍖?鍙樺寲鐨勫懡浠ゆā寮忥細
鍛戒護妯″紡鐨勮鑹叉瘮杈冨錛屽湪瀹為檯搴旂敤縐嶆垜浠彲浠ユ牴鎹墍闇瑕佺殑鍔熻兘鍜屼笉闇瑕佺殑鍔熻兘鍔犱互綆鍖栥?br />
1銆嬪幓鎺?璋冪敤鑰?br />
浜х敓鍛戒護闆嗗悎鍚庯紝鎴戜滑鍙互鐩存帴鍦╟lient涓凱浠f墽琛屾墽琛屾搷浣?br />
2銆?鍙樺寲 璋冪敤鑰?鎴愪負 璺熻釜鑰?br />
//璋冪敤鑰?br />
public class Invoker{
List commands; //宸茬粡鎵ц瀹屾瘯鐨勫懡浠ら泦鍚?br />
public void addCommand (Command command,int i){
commands.add(i,command);
}
public void action(Command command){
//鎵ц鎿嶄綔
command. execute();
//
commands.add(command);
}
}
……………
//榪樺彲浠ユ湁涓板瘜鐨剅edo鍜寀ndo鎿嶄綔錛?褰撶劧涓浜涢兘緇欏熀浜庡懡浠ょ被鎻愪緵鐨勭浉搴旀柟娉?
}
榪欐牱榪欎釜綾誨氨璁板綍浜嗘墍鏈夋墽琛岃繃鐨勬搷浣溿?br />
3銆嬪幓鎺?鍛戒護 鐢╩ap鏇夸唬
鎴戜滑瀹屽叏鍙互鐢╩ap浠f浛鍛戒護錛岃繖鏍鋒棤闇瀹氫箟鍚勭鍛戒護綾?br />
鎴戜滑鏀硅繘渚嬪瓙
Author author 錛?new Author();
Publisher publisher 錛?new Publisher ();
Map m = new HashMap;
m.put(author, write);
m.put(author, publisherBook);
鍦↖nvoker鐨刟ction鏂規硶錛?br />
寰椾唬map
榪愮敤java鍙嶅皠鏉ヨ皟鐢ㄦ柟娉曪紱
4銆嬪幓鎺夋墽琛岃咃細
鐩存帴鍦ㄥ懡浠や腑錛坋xecute鏂規硶縐嶏級鍔犱笟鍔¢昏緫銆傝繖鏍峰彧閫傚悎浜庣畝鍗曠殑灝忕殑緋葷粺.
鍏朵粬瑕佽鐨勫唴瀹?br />
1銆?灝嗘煇浜涘弬鏁頒紶緇欐煇涓柟鍙戠殑鏂瑰紡寰堝錛岄櫎浜嗗綋浣滄柟娉曠殑鍙傛暟澶栬繕鍙互褰撲綔綾葷殑鎴愬憳渚夸咯鍙橀噺浼犲叆錛?br />
榪欏氨涓哄懡浠ょ殑鎶借薄甯︽潵浜嗘瀬澶х殑鏂逛究
abstract class Command
{
abstract public void execute();
}
褰撴垜浠凡緇忔湁浜嗘墽琛岃咃紙綾籘est錛夋柟娉昬xecute錛坅rgs1錛宎rgs2 ….argsn錛?br />
鎴戜滑涓嶅繀鍚慍ommand鍔犲叆execute錛坅rgs1錛宎rgs2 ….argsn錛夋娊璞℃柟娉曪紝鍦ㄨ鍗充嬌鍔犱簡錛屽湪鎴戜滑榪唬鐨勬椂鍊欎篃鏃犳硶鍒ゆ柇鎴栧崄鍒嗕笉瀹規槗鍒ゆ柇鍝釜鍛戒護璋冪敤鍝釜execute鏂規硶銆?br />
閭d箞鎴戜滑鍙互榪欐牱
class ConcreteCommand : Command
{
Test test;
args1
args2
…..
argsn
public override void Execute()
{
test. execute (args1錛宎rgs2 ….argsn);
}
}
2銆?鍦ㄦ兂璺熻釜鎿嶄綔鐨勬椂鍊欙紝涓鑸負姣忎竴涓搷浣滃璞″垎閰嶄竴涓皟鐢ㄨ咃紝鎿嶄綔瀵硅薄鍦ㄨ皟鐢ㄨ呬腑璁劇疆銆傦紙鍙互鎶借薄鍑轟竴涓葷殑璋冪敤鑰咃紝鏉ュ崗璋冭皟鐢ㄦ瘡涓涓叿浣撶殑璋冪敤鑰咃級
3銆?鍛戒護鐨勬娊璞$矑搴︽垜瑙夊緱鏄娉ㄦ剰鐨勩?br />
4銆?鐞嗚В鎬濇兂錛屼笉瑕佹満姊扮殑鐓ф惉銆傛秷鍖栨垚鑷繁鐨勶紝鍔犱互鐏墊椿鐨勮繍鐢ㄥ拰鍒涢犲湪鏄牴鏈嚭璺?br />
鎵璋撳懡浠ゆā寮忕殑鏍規湰鎬濇兂灝辨槸鍦?鍏堝艦鎴愬懡浠わ紝鍦ㄦ牴鎹懡浠ゆ墽琛屻?br />
鍙傝冿細http://blog.csdn.net/baggio785/archive/2006/05/23/750513.aspx
]]>
1.public class CarFactory{
public static Car getCar(int type){
if(type == 1){
return new Car1();
} else {
return new Car2();
}
}
}
2. public class CarFactory{
public static Car getCar(String carClass){
String className = carClass;
Class c = Class.forName(className);
Car car = (Car)c.newInstance();
return car;
}
}
3. public class CarFactory{
public static Car getCar(String carJNDIName){
InitialContext ic = new InitialContext();
String className = ic.lookUp(carJNDIName);
Car car = (Car)Class.forName(className).newInstance();
return car;
}
}
鏂瑰紡1锝?閫傚悎浜庡伐鍘傛墍浜х敓鐨勫璞¢兘鏄睘浜庡悓涓涓埗綾誨瀷鐨勶紝鑰屼粠鏂瑰紡1锝?鏉ョ湅錛屾柟寮?鏃犵枒鏄渶綆鍗曠殑錛屼篃鏄渶瀹規槗鐞嗚В鍜屾帴鍙楃殑錛岃屾柟寮?鍜屾柟寮?鍒欑浉瀵規潵璇磋楂樼駭涓鐐廣傞珮綰у湪鍝噷鍛紵鎴戜滑鍙互鐪嬪埌錛屾柟寮?涓瀵硅薄鐨勫垱寤烘槸浣跨敤Hardcode鐨勫艦寮忥紝涔熷嵆鏄▼搴忓憳闇瑕佷簨鍏堢煡閬撶郴緇熼噷闈㈠瓨鍦ㄥ灝戜釜綾誨瀷鐨勫璞″強鍏跺搴旂殑緙栧彿錛屼竴鏃﹀鍔犳垨鍒犻櫎銆佷慨鏀逛簡瀵硅薄鐨勭被鍨嬶紝鍒欏繀鐒跺紩璧穒f-else鍧楃殑鏀瑰彉錛岄犳垚浜嗙淮鎶ょ殑鍥伴毦銆?br />
鑰屾柟寮?鍒欓噰鐢ㄤ簡鍔ㄦ佺被鍔犺澆鐨勬柟寮忥紝鏂瑰紡3鍦ㄦ柟寮?鐨勫熀紜涓婁嬌鐢ㄤ簡JNDI錛屾洿榪涗簡涓姝ワ紝鍏跺ソ澶勬槸涓嶇敤鍑虹幇HardCode鐨勬柟寮忥紝鍗充究浣犲悗闈㈢殑搴旂敤澧炲姞銆佸垹闄や簡瀵硅薄鐨勭被鍨嬶紝鎴戠殑紼嬪簭榪樻槸淇濇寔鐜板湪鐨勬牱瀛愶紝璺熻繘涓姝ユ潵璇達細鍙互鍘繪帀閭d簺璁ㄥ帉鐨刬f-else璇彞銆?br />
2. 宸ュ巶鏂規硶妯″紡鍘繪帀浜嗙畝鍗曞伐鍘傛ā寮忎腑宸ュ巶鏂規硶鐨勯潤鎬佸睘鎬э紝浣垮緱瀹冨彲浠ヨ瀛愮被緇ф壙銆傝繖鏍峰湪綆鍗曞伐鍘傛ā寮忛噷闆嗕腑鍦ㄥ伐鍘傛柟娉曚笂鐨勫帇鍔涘彲浠ョ敱宸ュ巶鏂規硶妯″紡閲屼笉鍚岀殑宸ュ巶瀛愮被鏉ュ垎鎷呫傘?font style="background-color: #c7edcc">瀹炶川涓婂畠鏄宸ュ巶瀹炵幇浜嗘娊璞$殑宸ュ巶鎺ュ彛錛屽畠鎶婂叿浣撴庝箞鐢熶駭涓縐嶄笢瑗匡紝鏀懼湪鍏蜂綋鐨勫伐鍘傚幓瀹炵幇浜嗭紝鎵璋?#8221;寤惰繜鍒板瓙綾諱腑瀹炵幇“銆?/span>
紺轟緥涓錛?br />
public interface Driver{
public Car driverCar();
}
public class BenzDriver implements Driver{
public Car driverCar(){
return new Benz();
}
}
public class BmwDriver implements Driver{
public Car driverCar() {
return new Bmw();
}
}
// 搴旇鍜屽叿浣撲駭鍝佸艦鎴愬搴斿叧緋?/span> ...
// 鏈夎鏆村彂鎴峰厛鐢?/span>
public class Magnate
{
public static void main(String[] args)
{
try{
Driver driver = new BenzDriver();
Car car = driver.driverCar();
car.drive();
}
……
}
紺轟緥浜岋細
public interface Creator
{
public Prouct factory();
}
public SubCreator1 implent Creator
{
public Prouct factory()
{
return new ConcreteProduct1();
}
}
public SubCreator2 implent Creator
{
public Prouct factory()
{
return new ConcreteProduct2();
}
}
璇鋒敞鎰忥細榪斿洖綾誨瀷鏄疨roduct鍨嬬殑錛侊紒
榪欐牱瀹㈡埛绔皟鐢ㄦ槸鐩存帴new 涓涓叿浣撳伐鍘傜殑瀹炰緥錛岀劧鍚庡懡浠ゅ畠鍘葷敓浜э紝鑰屽浜庡叿浣撳伐鍘傜殑鐖剁被錛堟棦宸ュ巶鎺ュ彛錛屾帴鍙e畬鍏ㄥ彲浠ユ敼鎴愬瓙綾葷戶鎵跨埗綾繪潵瀹炵幇錛屽彧鏄繖鏍蜂笉濂斤紝涓嶇鍚圤O鐨勫師鍒欙級錛屽畠瀹屽叏涓嶇煡閬撲粈涔堜駭鍝佽鐢熶駭浜嗭紝鐢氳嚦瀹冭繛閭d釜鍏蜂綋宸ュ巶琚疄渚嬪寲瀹冮兘涓嶇煡閬擄紒
3. 鎶借薄宸ュ巶
public abstract class AbstractFactory{
public abstract Car getCar(String carClass);
public abstract Plane getPlane(String planeClass);
}
public class Factory1 extends AbstractFactory{
public Car getCar(String carClass){
// 鍙傝冧笂闈㈢殑鏂瑰紡1锝?
return car1;
}
public Plane getPlane(String planeClass){
// 鍙傝冧笂闈㈢殑鏂瑰紡1锝?
return plane1;
}
}
public class Factory2 extends AbstractFactory{
public Car getCar(String carClass){
// 鍙傝冧笂闈㈢殑鏂瑰紡1锝?
return car2;
}
public Plane getPlane(String planeClass){
// 鍙傝冧笂闈㈢殑鏂瑰紡1锝?
return plane2;
}
}