
作图题
有电视机工厂(TVFAacyory)和电视机(TV)这两种类型的对象,电视机的主要方法是(void play()),电视机工厂的主要方法是(TV produceTV()).已经知道海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海信电视机,请按具体工厂模式画出类图。
P83
有直接面向客户的抽象目标类Robot,其提供的抽象方法为(void cry())和(void move())。现有仿生机器狗类Dog,其提供方法分别为(void wang())和(void run())。有一个适配器类DogAdapter类,使得客户可以通过DogAdapter类访问Dog类的方法。请按类适配器模式画出类图。
P152
有Buttom、Windows、Command、ExitCommd四个类。其中Buttom类是调用者;Windows类是接受者,有一个exitwnd()方法,是调用者最终所期望的运行的方法;Command类是抽象命令类,其中有一个抽象方法execute();ExitCommand是具体的命令类,实现了execute()方法,请按命令模式画出类图。
假设猫(Cat)是老鼠(Mouse)和狗(Dog)的观察目标(AnimalSubject),老鼠和狗是观察者(AnimalObserver),猫叫(cry())老鼠跑,狗也跟着叫,使用观察者模式描述该过程的类图。
程序题
某OA系统中,系统根据对比用户在登录时输入的帐号和密码以及在数据库中存储的帐号和密码是否一致来进行身份验证,如果验证通过,则取出存储在数据库中的用户权限等级(以整数形式存储),根据不同的权限等级创建不同等级的用户对象,不同等级的用户对象拥有不同的操作权限。现使用简单工厂模式来设计该权限模块。
P69
public abstract class User
{
public abstract void diffOperation();
}
public class Employee extends User
{
public Employee(){ System.out.println(“创建员工对象!”);}
public void diffOperation(){ System.out.println(“员工有创建假条权限!”);}
}
public class Manager extends User
{
public Manager(){ System.out.println(“创建经理对象!”);}
public void diffOperation(){ System.out.println(“经理有创建和审批假条权限!”);}
}
public class Admin extends User
{
public Admin(){ System.out.println(“创建管理员对象!”);}
public void diffOperation(){ System.out.println(“管理员有创建和管理假条权限!”);}
}
public class UserFactory
{
public static User getUser(int prr)
{
if(0==per){return new Employee();}
else if(1==per){return new Manager();}
else if(2==per){return new Admin();}
else{return null;}
}
}
现在考察一个电源总开关的例子,以便进一步说明外观模式。为了使用方便,一个电源总开关可以控制一个风扇、一台空调和一台电视机的启动和关机。通过改电源总开关可以同时控制上述所有设备,使用外观模式设计该系统。
P218
风扇类
Public class Fan
{
Public void on(){ System.out.println(“风扇打开!”);}
Public void off(){ System.out.println(“风扇关闭!”);}
}
空调类
Public class AirConditioner
{
Public void on(){ System.out.println(“空调打开!”);}
Public void off(){ System.out.println(“空调关闭!”);}
}
电视机类
Public class Television
{
Public void on(){ System.out.println(“电视机打开!”);}
Public void off(){ System.out.println(“电视机关闭!”);}
}
外观类
Public class Switch
{
Private Fan fan;
Private AirConditioner ac;
Private Television tc;
Public Switch()
{
fan=new Fan();
ac=new AirConditioner();
tv=new Television();
}
Public void on()
{
fan..on();
ac.on();
tv.on();
}
Public void off()
{
fan..off();
ac.off();
tv.off();
}
}
某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式,现使用工厂方法模式设计该系统。
public interface Log
{
public void writeLog();
}
public class FileLog implements Log
{
public void writeLog()
{
System.out.println(“文件记录!”);
}
}
public class DatabaseLog implements Log
{
public void writeLog()
{
System.out.println(“数据库记录!”);
}
}
public interface LogFactory
{
public void createLog();
}
public class FileLogFactory implements LogFactory
{
public void createLog()
{
System.out.println(“文件记录创建中!”);
return new FileLog();
}
}
public class DatabaseLogFactory implements LogFactory
{
public void createLog()
{
System.out.println(“数据库记录创建中!”);
return new DatabaseLog();
}
}
请编写类MyObj的克隆方法deepClone,MyObj有两个私有属性分别为x和y,其类型为string。
public class MyObj implements Serializable
{
private string x=null;
private string y=null;
}
public MyObj()
{
this.x=new string();
this.y=new string();
}
public deepClone() throws IOException,ClassNotFoundException,OptionalDataException
{
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObiectOutputStream oos=new ObiectOutputStream(bao);
oos.writeObject(this);
ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
ObiectInputStream ois=new ObiectInputStream(bis);
return(ois.readObject();)
}
public string getx(){ return this.x;}
public string gety(){ return this.y;}
public void display(){System.out.println(“查看x,y”);}
用JAVA代码模拟实现“数算代理”实例,运算包括加减乘除,数据类型为double。
public interface Calculator
{
public double add(double x,double y);
public double sub(double x,double y);
public double mul(double x,double y);
public double div(double x,double y);
}
public class RealCalculator implements Calculator
{
public double add(double x,double y){ return x+y; }
public double sub(double x,double y){ return x-y ; }
public double mul(double x,double y){ return x*y; }
public double div(double x,double y){ return x/y; }
}
public class ProxyCalculator implements Calculator
{
private RealCalculator real’
public void init(){ real=new RealCalculator();}
public double add(double x,double y){ real.add(x,y);}
public double sub(double x,double y){ real.sub(x,y);}
public double mul(double x,double y){ real.mul(x,y);}
public double div(double x,double y){ real.div(x,y);}
}
设计模式的7个原则(P26)
单一职责原则
开闭原则
里氏代换原则
依赖倒转原则
接口隔离原则
合成复用原则
迪米特法则
简要分析各个模式的角色。
简单工厂模式:工厂角色,抽象产品角色,具体产品角色
工厂方法模式:抽象产品,具体产品,抽象工厂,具体工厂
抽象工厂模式:抽象工厂,具体工厂,抽象产品,具体产品
建造者模式:抽象建造者,具体建造者,产品角色,指挥者
原型模式:抽象原型类,具体原型类,客户类
适配器模式:目标抽象类,适配器类,适配者类,客户类
外观模式:外观角色,子系统角色
代理模式:抽象主题角色,代理主题角色,真实主题角色
命令模式:抽象命令类,具体命令类,调用者,接收者,客户类
观察者模式:目标,具体目标,观察者,具体观察者
