恳求发送者与接管者解耦——号令模式(二)
添加时间:2013-6-25 点击量:
3 完全解决规划
为了降落功能键与功能处理惩罚类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开辟人员应用号令模式来设计“自定义功能键”模块,其核心布局如图4所示:
图4 自定义功能键核心布局图
在图4中,FBSettingWindow是“功能键设置”界面类,FunctionButton充当恳求调用者,Command充当抽象号令类,MinimizeCommand和HelpCommand充当具体号令类,WindowHanlder和HelpHandler充当恳求接管者。完全代码如下所示:
- import java.util.;
-
- //功能键设置窗口类
- class FBSettingWindow {
- private String title; //窗口题目
- //定义一个ArrayList来存储所有功能键
- private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>();
-
- public FBSettingWindow(String title) {
- this.title = title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getTitle() {
- return this.title;
- }
-
- public void addFunctionButton(FunctionButton fb) {
- functionButtons.add(fb);
- }
-
- public void removeFunctionButton(FunctionButton fb) {
- functionButtons.remove(fb);
- }
-
- //显示窗口及功能键
- public void display() {
- System.out.println(显示窗口: + this.title);
- System.out.println(显示功能键:);
- for (Object obj : functionButtons) {
- System.out.println(((FunctionButton)obj).getName());
- }
- System.out.println(------------------------------);
- }
- }
-
- //功能键类:恳求发送者
- class FunctionButton {
- private String name; //功能键名称
- private Command command; //保持一个抽象号令对象的引用
-
- public FunctionButton(String name) {
- this.name = name;
- }
-
- public String getName() {
- return this.name;
- }
-
- //为功能键注入号令
- public void setCommand(Command command) {
- this.command = command;
- }
-
- //发送恳求的办法
- public void onClick() {
- System.out.print(点击功能键:);
- command.execute();
- }
- }
-
- //抽象号令类
- abstract class Command {
- public abstract void execute();
- }
-
- //帮助号令类:具体号令类
- class HelpCommand extends Command {
- private HelpHandler hhObj; //保持对恳求接管者的引用
-
- public HelpCommand() {
- hhObj = new HelpHandler();
- }
-
- //号令履行办法,将调用恳求接管者的营业办法
- public void execute() {
- hhObj.display();
- }
- }
-
- //最小化号令类:具体号令类
- class MinimizeCommand extends Command {
- private WindowHanlder whObj; //保持对恳求接管者的引用
-
- public MinimizeCommand() {
- whObj = new WindowHanlder();
- }
-
- //号令履行办法,将调用恳求接管者的营业办法
- public void execute() {
- whObj.minimize();
- }
- }
-
- //窗口处理惩罚类:恳求接管者
- class WindowHanlder {
- public void minimize() {
- System.out.println(将窗口最小化至托盘!);
- }
- }
-
- //帮助文档处理惩罚类:恳求接管者
- class HelpHandler {
- public void display() {
- System.out.println(显示帮助文档!);
- }
- }
为了进步体系的灵活性和可扩大性,我们将具体号令类的类名存储在设备文件中,并经由过程对象类XMLUtil来读取设备文件并反射生成对象,XMLUtil类的代码如下所示:
- import javax.xml.parsers.;
- import org.w3c.dom.;
- import org.xml.sax.SAXException;
- import java.io.;
-
- public class XMLUtil {
- //该办法用于从XML设备文件中提取具体类类名,并返回一个实例对象,可以经由过程参数的不合返回不合类名节点所对应的实例
- public static Object getBean(int i) {
- try {
- //创建文档对象
- DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = dFactory.newDocumentBuilder();
- Document doc;
- doc = builder.parse(new File(config.xml));
-
- //获取包含类名的文本节点
- NodeList nl = doc.getElementsByTagName(className);
- Node classNode = null;
- if (0 == i) {
- classNode = nl.item(0).getFirstChild();
- }
- else {
- classNode = nl.item(1).getFirstChild();
- }
-
- String cName = classNode.getNodeValue();
-
- //经由过程类名生成实例对象并将其返回
- Class c = Class.forName(cName);
- Object obj = c.newInstance();
- return obj;
- }
- catch(Exception e){
- e.printStackTrace();
- return null;
- }
- }
- }
设备文件config.xml中存储了具体建造者类的类名,代码如下所示:
编译并运行法度,输出成果如下:
显示窗口:功能键设置
显示功能键:
功能键1
功能键1
------------------------------
点击功能键:显示帮助文档!
点击功能键:将窗口最小化至托盘!
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
3 完全解决规划
为了降落功能键与功能处理惩罚类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开辟人员应用号令模式来设计“自定义功能键”模块,其核心布局如图4所示:
图4 自定义功能键核心布局图
在图4中,FBSettingWindow是“功能键设置”界面类,FunctionButton充当恳求调用者,Command充当抽象号令类,MinimizeCommand和HelpCommand充当具体号令类,WindowHanlder和HelpHandler充当恳求接管者。完全代码如下所示:
- import java.util.;
- //功能键设置窗口类
- class FBSettingWindow {
- private String title; //窗口题目
- //定义一个ArrayList来存储所有功能键
- private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>();
- public FBSettingWindow(String title) {
- this.title = title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- public String getTitle() {
- return this.title;
- }
- public void addFunctionButton(FunctionButton fb) {
- functionButtons.add(fb);
- }
- public void removeFunctionButton(FunctionButton fb) {
- functionButtons.remove(fb);
- }
- //显示窗口及功能键
- public void display() {
- System.out.println(显示窗口: + this.title);
- System.out.println(显示功能键:);
- for (Object obj : functionButtons) {
- System.out.println(((FunctionButton)obj).getName());
- }
- System.out.println(------------------------------);
- }
- }
- //功能键类:恳求发送者
- class FunctionButton {
- private String name; //功能键名称
- private Command command; //保持一个抽象号令对象的引用
- public FunctionButton(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- //为功能键注入号令
- public void setCommand(Command command) {
- this.command = command;
- }
- //发送恳求的办法
- public void onClick() {
- System.out.print(点击功能键:);
- command.execute();
- }
- }
- //抽象号令类
- abstract class Command {
- public abstract void execute();
- }
- //帮助号令类:具体号令类
- class HelpCommand extends Command {
- private HelpHandler hhObj; //保持对恳求接管者的引用
- public HelpCommand() {
- hhObj = new HelpHandler();
- }
- //号令履行办法,将调用恳求接管者的营业办法
- public void execute() {
- hhObj.display();
- }
- }
- //最小化号令类:具体号令类
- class MinimizeCommand extends Command {
- private WindowHanlder whObj; //保持对恳求接管者的引用
- public MinimizeCommand() {
- whObj = new WindowHanlder();
- }
- //号令履行办法,将调用恳求接管者的营业办法
- public void execute() {
- whObj.minimize();
- }
- }
- //窗口处理惩罚类:恳求接管者
- class WindowHanlder {
- public void minimize() {
- System.out.println(将窗口最小化至托盘!);
- }
- }
- //帮助文档处理惩罚类:恳求接管者
- class HelpHandler {
- public void display() {
- System.out.println(显示帮助文档!);
- }
- }
为了进步体系的灵活性和可扩大性,我们将具体号令类的类名存储在设备文件中,并经由过程对象类XMLUtil来读取设备文件并反射生成对象,XMLUtil类的代码如下所示:
- import javax.xml.parsers.;
- import org.w3c.dom.;
- import org.xml.sax.SAXException;
- import java.io.;
- public class XMLUtil {
- //该办法用于从XML设备文件中提取具体类类名,并返回一个实例对象,可以经由过程参数的不合返回不合类名节点所对应的实例
- public static Object getBean(int i) {
- try {
- //创建文档对象
- DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = dFactory.newDocumentBuilder();
- Document doc;
- doc = builder.parse(new File(config.xml));
- //获取包含类名的文本节点
- NodeList nl = doc.getElementsByTagName(className);
- Node classNode = null;
- if (0 == i) {
- classNode = nl.item(0).getFirstChild();
- }
- else {
- classNode = nl.item(1).getFirstChild();
- }
- String cName = classNode.getNodeValue();
- //经由过程类名生成实例对象并将其返回
- Class c = Class.forName(cName);
- Object obj = c.newInstance();
- return obj;
- }
- catch(Exception e){
- e.printStackTrace();
- return null;
- }
- }
- }
设备文件config.xml中存储了具体建造者类的类名,代码如下所示:
编译并运行法度,输出成果如下:
显示窗口:功能键设置 显示功能键: 功能键1 功能键1 ------------------------------ 点击功能键:显示帮助文档! 点击功能键:将窗口最小化至托盘! 无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》 |