所有程序在以下环境中实现:
操作 系统 :Windows XP Pro sp1
编程 环境 :J2SDK 1.4.2 、JCreator Pro 2.00
UML工具 :Borland Together Architect
参考 书籍 :《Java与模式》 阎宏 编著
打印 排版 :Microsoft Office Word 2003
创建模式 —— Factory Method
这是一个描述创建模式工厂方法的例子:一个餐具生产工厂(TablewareFactory),生产
三种餐具:筷子(chopsticts)、餐刀(knife)、餐叉(fork).生产过程使用了factory method 。Interface Tableware 作为 Fork,Knife,Chopsticts的公共接口。Interface TablewareMaker作为生产工人ForkMaker,KnifeMaker,ChopMaker的公共接口。类图如下:
实现代码如下:
1 - 接口Tableware的实现
package zhijun.javapattern.factorymethod;
public interface Tableware { public void getMes(); }
2 – Fork 类的实现
package zhijun.javapattern.factorymethod;
public class Fork implements Tableware
{
public Fork() { System.out.println("A fork is made."); }
public void getMes() { System.out.println("This is a fork ."); }
}
3 – Knife 类的实现
package zhijun.javapattern.factorymethod;
public class Knife implements Tableware
{
public Knife() { System.out.println("A knife is made."); }
public void getMes() { System.out.println("This is a knife ."); }
}
4 – Chopsticts 类的实现
package zhijun.javapattern.factorymethod;
public class Chopsticks implements Tableware
{
public Chopsticks() { System.out.println("A pair of chopsticks are made."); }
public void getMes() {System.out.println("They are A pair of chopsticks ."); }
}
5 – 接口TablewareMaker 的实现
package zhijun.javapattern.factorymethod;
public interface TablewareMaker { public Tableware make();}
6 – ForkMaker 类的实现
package zhijun.javapattern.factorymethod;
public class ForkMaker implements TablewareMaker
{
public ForkMaker() {}
public Tableware make() { return new Fork(); }
}
7 – KnifeMaker类的实现
package zhijun.javapattern.factorymethod;
public class KnifeMaker implements TablewareMaker
{
public KnifeMaker() {}
public Tableware make() { return new Knife(); }
}
8 – ChopMaker 类的实现
package zhijun.javapattern.factorymethod;
public class ChopMaker implements TablewareMaker
{
public ChopMaker() {}
public Tableware make() { return new Chopsticks(); }
}
9 – 客户端程序TablewareFactory 实现
package client_test;
import zhijun.javapattern.factorymethod.*;
public class TablewareFactory
{
public static TablewareMaker forkMaker, knifeMaker,chopsticksMaker;
public static Tableware fork, knife, chopsticks;
public static void main(String [] args)
{
forkMaker = new ForkMaker();
knifeMaker = new KnifeMaker();
chopsticksMaker = new ChopMaker();
fork = forkMaker.make();
knife = knifeMaker.make();
chopsticks = chopsticksMaker.make();
}
}
结构模式 —— Facade模式
本例来自《java与模式》。
程序说明:本程序模拟一个保安系统来说明门面模式。这个保安系统由2个录像机(Camera),2个电灯(Light),一个传感器(Sensor),一个报警器(Alarm)组成。保安系统的操作人员需要经常启动(activate)和关闭(deactivate)这些系统。根据门面模式,设计一个控制台(SecurityFacade),作为保安系统的用户界面。保安系统的操作人员只需要操作这个简化的界面就可以控制所有的仪器。
门面 SecurityFacade 对象承担了与保安系统的内部各个对象打交道的任务,而客户对象只需要与门面对象打交道即可。这是客户端与保安系统之间的一个门户,踏使得客户端与内部程序之间的关系变得简单和易于管理。系统类图如下:
源代码如下:
1 – 客户端程序Client .java
package zhijun.javapattern.facade;
public class Client
{
private static SecurityFacade security;
public static void main(String [] args)
{
security = new SecurityFacade();
security.activate();
security.deactivate();
}
}
2 – 门面SecurityFacade.java
package zhijun.javapattern.facade;
public class SecurityFacade
{
private Camera camera1 = new Camera();
private Camera camera2 = new Camera();
private Light light1 = new Light();
private Light light2 = new Light();
private Sensor sensor = new Sensor();
private Alarm alarm = new Alarm();
public void activate()
{
camera1.turnOn(); camera2.turnOn();
light1.turnOn(); light2.turnOn();
sensor.activate(); alarm.acticate();
}
public void deactivate()
{
camera1.turnOff(); camera2.turnOff();
light1.turnOff(); light2.turnOff();
sensor.activate(); alarm.acticate();
}
}
3 – 摄像机Camera.java
package zhijun.javapattern.facade;
public class Camera
{
public void turnOn() { System.out.println("Turn on the camera."); }
public void turnOff() { System.out.println("Turn off the camera."); }
public void rotate(int degrees)
{ System.out.println("Rotate the camera by " + degrees + "degrees." ); }
}
4 – 电灯 Light.java
package zhijun.javapattern.facade;
public class Light
{
public void turnOn() { System.out.println("Turn on the light."); }
public void turnOff() { System.out.println("Turn off the light."); }
//更换灯泡
public void changeBulb() { Sysetm.out.println(“Change ths Lighy Bulb”);}
}
5 – 传感器 Sensor.java
package zhijun.javapattern.facade;
public class Sensor
{
public void activate() { System.out.println("Activating the sensor."); }
public void deactivate() { System.out.println("Deactivating the sensor."); }
//触发感应器
public void trigger() { System.out.println("The sensor has been triggered."); }
}
6 – 报警器 Alarm.java
package zhijun.javapattern.facade;
public class Alarm
{
public void acticate() { System.out.println("Activating the alarm."); }
public void deactivate() { System.out.println("Deactivating the alarm."); }
//报警铃响
public void ring() { System.out.println("Ring the alarm."); }
//停止报警
public void stopRing() { System.out.println("Stop the alarm."); }
}
行为模式 —— Command
本例来自《java与模式》。
Command模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分开,委派不同的对象。每一个都是一个操作:请求的一方发出一个请求要执行一个操作;接受的一方收到请求并执行操作。
本例通过模拟一个 看电视者通过遥控器控制电视的系统 来演示Command的应用。
在设计中,TvWatcher(看电视者)扮演客户角色,Controler(遥控器)扮演请求者,TvWatcher通过Controler(遥控器)发出命令,这写命令由电视机接收。 抽象命令角色由一个命令接口(Command)扮演,系统一共有三个具体命令类:OnCommand、OffCommand、ChannelCommand,分别代表3种操作:打开电视、关上电视,换台。Controler(遥控器)把实现操作的细节同客户端分隔开来,TvWatcher(看电视者)只需要操作遥控器(按下相应的按扭)就可以实现对电视的操作(开、关、换台)。
系统的UML类图如下:
其源代码如下:
1 — 客户端程序:
package client_test;
import zhijun.javapattern.command.*;
public class TvWatcher
{
private static Controler controler;
public static void main(String [] args)
{ test(); }
public static void test()
{
TV myTV = new TV();
OnCommand on = new OnCommand(myTV);
OffCommand off = new OffCommand(myTV);
ChannelCommand channel = new ChannelCommand(myTV, 2);
controler = new Controler(on, off, channel);
controler.turnOn();
controler.changeChannel();
controler.turnOff();
}
}
2 — 命令接口 Command.java
package zhijun.javapattern.command;
public interface Command
{
void execute();
}
3 — 具体命令OnCommand.java
package zhijun.javapattern.command;
public class OnCommand implements Command
{
private TV myTV;
public OnCommand(TV tv) { myTV = tv; }
public void execute() { myTV.turnOn(); }
}
4 — 具体命令 OffCommand.java
package zhijun.javapattern.command;
public class OffCommand implements Command
{
private TV myTV;
public OffCommand(TV tv) { myTV = tv; }
public void execute() { myTV.turnOff(); }
}
5 — 具体命令 ChannelCommand.java
package zhijun.javapattern.command;
public class ChannelCommand implements Command
{
private TV myTV;
private int channel;
public ChannelCommand(TV tv, int channel)
{
myTV = tv;
this.channel = channel;
}
public void execute() { myTV.changeChannel(channel); }
}
6 — 命令请求者 Controler.java
package zhijun.javapattern.command;
public class Controler
{
private Command onCommand, offCommand, channelCommand;
public Controler(Command on, Command off, Command channel)
{
onCommand = on;
offCommand = off;
channelCommand = channel;
}
public void turnOn() { onCommand.execute(); }
public void turnOff() { offCommand.execute(); }
public void changeChannel() { channelCommand.execute(); }
}
7 — 命令接收者 TV.java
package zhijun.javapattern.command;
public class TV
{
private int currentChannel = 0;
public void turnOn() { System.out.println("The TV is on."); }
public void turnOff() { System.out.println("The TV is off."); }
public void changeChannel(int channel)
{
currentChannel = channel;
System.out.println("Now TV channel is : " + channel);
}
}
运行结果截图: