1、要求:某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等;用户可以根据要求动态选择日志记录方式。使用Factory模式来设计;如果系统中增加一个日志记录方式—控制台日志记录(ConsoleLog),类图将如何改变?
使用Factory设计模式并增加 控制台日志记录(ConsoleLog)
后的类图如下图所示。
其中,不同类型的记录方式分别 Log
接口,关键代码如下
public interface Log
{
//日志记录方式接口
public void writeLog();
}
public class FileLog implements Log
{
public void writeLog()
{
//文件日志记录方式
}
}
public class DatabaseLog implements Log
{
public void DatabaseLogLog()
{
//数据库日志记录方式
}
}
public class ConsoleLog implements Log
{
public void ConsoleLog()
{
//控制台日志记录方式
}
}
不同类型的日志工厂关键代码如下。
public interface LogFactory
{
//日志类型工厂接口
public Log createLog();
}
public class FileLogFactory implements LogFactory
{
//文件日志工厂
public Log createLog()
{
return new FileLog();
}
}
public class DatabaseLogFactory implements LogFactory
{
//数据库日志工厂
public Log createLog()
{
return new DatabaseLog();
}
}
public class ConsoleLogFactory implements LogFactory
{
//控制台日志工厂
public Log createLog()
{
return new ConsoleLog();
}
}
2、要求:某系统为了改进数据库操作的性能,自定义数据连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象;用户可以通过配置文件等方式根据实际需要动态更换系统数据库;使用Abstract Factory模式来设计。
使用Abstract Factory模式设计类图如下所示。
其关键类代码及注释如下所示。
public interface Connection
{
//Connection类
}
public class MySQLConnection implements Connection
{
//MySQLConnection 类
}
public class OracleConnection implements Connection
{
//OracleConnection 类
}
public interface Statement
{
//Statement类
}
public class OracleStatement implements Statement
{
//OracleStatement类
}
public class OracleStatement implements Statement
{
//OracleStatement类
}
public interface DBFactory
{
//数据库工厂
Connection createConnection();
Statement createStatement();
}
public class MySQLFactory implements DBFactory
{
//MySQL工厂类
public Connection createConnection()
{
//产生MySQLConnection
return new MySQLConnection();
}
public Statement createStatement()
{
//产生MySQLStatement
return new MySQLStatement();
}
}
public class OracleFactory implements DBFactory
{
//Oracle工厂类
public Connection createConnection()
{
//产生OracleConnection
return new OracleConnection();
}
public Statement createStatement()
{
//产生OracleStatement
return new OracleStatement();
}
}
3、要求:KFC套餐是一个复杂对象,一般包括主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)组成部分,不同套餐有不同组成部分;KFC服务员要根据顾客要求,装配这些组成部分,构造一个完整套餐,返回给顾客;使用Builder模式来设计。
类图设计如下所示。
关键类代码如下所示。
public class Combo
{
//food和drink是部件
private String food;
private String drink;
public void setFood(String food)
{
this.food = food;
}
public void setDrink(String drink)
{
this.drink = drink;
}
public String getFood()
{
return this.food;
}
public String getDrink()
{
return this.drink;
}
}
public abstract class ComboBuilder
{
//建造者
protected Combo combo = new Combo();
public abstract void buildFood();
public abstract void buildDrink();
public Combo getCombo()
{
return Combo;
}
}
public class SubComboBuilderA extends ComboBuilder
{
//套餐A
public void buildFood()
{
combo.setFood("一个牛肉堡");
}
public void buildDrink()
{
combo.setDrink("一杯橙汁");
}
}
public class SubComboBuilderB extends ComboBuilder
{
//套餐B
public void buildFood()
{
combo.setFood("一个墨西哥鸡肉卷");
}
public void buildDrink()
{
combo.setDrink("一杯可乐");
}
}
public class KFCWaiter
{
//服务员是指挥者
private ComboBuilder cb;
public void setComboBuild(ComboBuilder cb)
{
this.cb = cb;
}
public Combo construct()
{
cb.buildFood();
cb.buildDrink();
return cb.getCombo();
}
}
4、要求:游戏中的地图:包括天空、地面、背景;人物包括人体、服装、装备等组成部分,如采用Builder模式如何设计?
类图设计如下所示。
关键类代码如下所示。
public class Map
{
//地图类
//天空、地面和背景是部件
private String sky;
private String ground;
private String background;
public void setSky(String sky)
{
this.sky = sky;
}
public void setGround(String ground)
{
this.ground = ground;
}
public void setBackground(String background)
{
this.background = background;
}
public String getSky()
{
return this.sky;
}
public String getGround()
{
return this.ground;
}
public String getBackground()
{
return this.background;
}
}
public class Figure
{
//人物类
//身体、服装和装备是部件
private String body;
private String cloth;
private String weapon;
public void setBody(String body)
{
this.body = body;
}
public void setCloth(String cloth)
{
this.cloth = cloth;
}
public void setWeapon(String weapon)
{
this.weapon = weapon;
}
public String getBody()
{
return this.body;
}
public String getCloth()
{
return this.cloth;
}
public String getWeapon()
{
return this.weapon;
}
}
public abstract class MapBuilder
{
//地图建造者
protected Map map = new Map();
public abstract void buildSky();
public abstract void buildGround();
public abstract void buildBackground();
public Map getMap()
{
return Map;
}
}
public class MapBuilderA extends MapBuilder
{
//地图A
public void buildSky()
{
map.setSky("天空");
}
public void buildGround()
{
map.setGround("地面");
}
public void buildBackground()
{
map.setBackground("背景");
}
}
public abstract class FigureBuilder
{
//人物建造者
protected Figure figure = new Figure();
public abstract void buildBody();
public abstract void buildCloth();
public abstract void buildWeapon();
public Map getFigure()
{
return Figure;
}
}
public class FigureBuilderA extends FigureBuilder
{
//人物A
public void buildBody()
{
map.setBody("身体");
}
public void buildCloth()
{
map.setCloth("服装");
}
public void buildWeapon()
{
figure.setWeapon("武器");
}
}
public class Game
{
//指挥者
private MapBuilder mb;
private FigureBuilder fb;
public void setMapBuilder(MapBuilder mb)
{
this.mb = mb;
}
public void setFigureBuilder(FigureBuilder fb)
{
this.fb = fb;
}
public Map Mapconstruct()
{
mb.buildSky();
mb.buildGround();
mb.buildBackground()
return mb.getMap();
}
public Figure figureConstruct()
{
fb.buildBody();
fb.buildCloth();
fb.buildWeapon()
return fb.getFigure();
}
}
5、某系统需要提供一个加密模块,将用户信息(如密码等)加密之后再存储在数据库中,系统已经定义好数据库操作类。为了提高开发效率,现要重用已有的加密算法,这些算法由第三方提供,没有源码。如采用Adapter模式如何设计?
类图设计如下所示。
关键代码如下
public class EncryptionAdapter extends DataOperator
{
private MD5 encryption;
public EncryptionAdapter()
{
encryption = new MD5();
}
public String encrypt(int key,String password)
{
encryption.encrypt(key,password);
}
}
public class NewEncryptionAdapter extends DataOperator
{
private NewEncryption encryption;
public NewEncryptionAdapter()
{
encryption = new NewEncryption();
}
public String encrypt(int key,String password)
{
encryption.encrypt(key,password);
}
}