您的位置:首页 > 其它

设计模式第一次作业

2017-11-07 00:40 204 查看
1、某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等;用户可以根据要求动态选择日志记录方式。使用Factory模式来设计;如果系统中增加一个日志记录方式—控制台日志记录(ConsoleLog),类图将如何改变?

类图



日志类

public interface log
{
public void writeLog();
}
public class fileLog implements log
{
public void writeLog()
{
//文件日志类
}
}
public class databaseLog implements log
{
public void writeLog()
{
//数据库日志类
}
}


工厂类

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();
}
}


增加控制台日志后类图如下



2、某系统为了改进数据库操作的性能,自定义数据连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象;用户可以通过配置文件等方式根据实际需要动态更换系统数据库;使用Abstract Factory模式来设计。

类图



工厂类

public interface DatabaseFactory
{
public Connection creatConnection();
public Statement creatStatement();
}
public class MySQLFactory implements DataBaseFactory
{
public Connection creatConnection()
{
return new MySQLConnection();
}
public Statement creatStatement()
{
return new MySQLStatements();
}
}
public class OracleFactory implements DataBaseFactory
{
public Connection creatConnection()
{
return new OracleConnection();
}
public Statement creatStatement()
{
return new OracleStatement();
}
}


Statement类

public interface Statement
{
public void statement();
}
public class MySQLStatement implements Statement
{
public void statement()
{
//MySQL语句类
}
}
public class OracleStatement implements Statement
{
public void statement()
{
//Oracle语句类
}
}


Connection类

public interface Connection
{
public void connection();  //Connection接口
}
public class MySQLConnection implements Connection
{
public void connection()
{
//MySQL连接类
}
}
public class OracleConnection implements Connection
{
public void connection()
{
//Oracle连接类
}
}

3、KFC套餐是一个复杂对象,一般包括主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)组成部分,不同套餐有不同组成部分;KFC服务员要根据顾客要求,装配这些组成部分,构造一个完整套餐,返回给顾客;使用Builder模式来设计。

类图



关键类代码如下所示:

public class Meal
{
private String food;
private String drink;
public String getFood()
{
return food;
}
public void setFood(String food)
{
this.food = food;
}
public String getDrink()
{
return drink;
}
public void setDrink(String drink)
{
this.drink = drink;
}
}
//builder类
public abstract class MealBuilder
{
protected Meal meal=new Meal();
public abstract void buildFood();
public abstract void bulidDrink();
public Meal getMeal()
{
return meal;
}
}
//套餐A
public class SubMealBuilderA extends MealBuilder
{
public void buildFood()
{
meal.setFood("一个鸡腿堡");
}
public void bulidDrink()
{
meal.setDrink("一杯可乐");
}
}
//套餐B
public class SubMealBuilderB extends MealBuilder
{
public void buildFood()
{
meal.setFood("一个鸡肉卷");
}
public void bulidDrink()
{
meal.setDrink("一杯芬达");
}
}
//Director
public class KFCWaiter
{
private MealBuilder mb;
public void setMealBuilder(MealBuilder mb)
{
this.mb=mb;
}
public Meal construct()
{
mb.buildFood();
mb.bulidDrink();
return mb.getMeal();
}
}

4、游戏中的地图:包括天空、地面、背景;人物包括人体、服装、装备等组成部分,如采用Builder模式如何设计?

类图



地图类

public class Map
{
private String sky;
private String ground;
private String background;
public String getSky()
{
return sky;
}
public void setSky(String sky)
{
this.sky = sky;
}
public String getGround()
{
return ground;
}
public void setGround(String ground)
{
this.ground = ground;
}
public String getBackground()
{
return background;
}
public void setBackground(String background) {
this.background = background;
}
}
//builder类
public abstract class MapBuilder
{
protected Map map=new Map();
public abstract void buildSky();
public abstract void bulidGround();
public abstract void bulidBackground();
public Map getMap()
{
return map;
}
}
//地图A
public class MapBuilderA extends MapBuilder
{
public void buildSky()
{
map.setSky("blue");
}
public void bulidGround()
{
map.setGround("sand");
}
public void bulidBackground()
{
map.setBackground("dark");
}
}
//地图B
public class MapBuilderB extends MapBuilder
{
public void buildSky()
{
map.setSky("cloudy");
}
public void bulidGround()
{
map.setGround("stone");
}
public void bulidBackground()
{
map.setBackground("dark");
}
}


角色类

public class Role
{
private String body;
private String suit;
private String equip;
public String getBody()
{
return body;
}
public void setBody(String body)
{
this.body = body;
}
public String getSuit()
{
return suit;
}
public void setSuit(String suit)
{
this.suit = suit;
}
public String getEquip()
{
return Equip;
}
public void setEquip(String equip) {
this.equip = equip;
}
}
//builder类
public abstract class RoleBuilder
{
protected Role role=new Role();
public abstract void buildBody();
public abstract void bulidSuit();
public abstract void bulidEquip();
public Role getRole()
{
return role;
}
}
//角色A
public class RoleBuilderA extends RoleBuilder
{
public void buildBody()
{
role.setBody("tall");
}
public void bulidSuit()
{
map.setSuit("t-shit");
}
public void bulidEquip()
{
map.setEquip("sword");
}
}
//角色B
public class RoleBuilderB extends RoleBuilder
{
public void buildBody()
{
role.setBody("short");
}
public void bulidSuit()
{
map.setSuit("dress");
}
public void bulidEquip()
{
map.setEquip("arrow");
}
}


Director类

//Director
public class Game
{
private MapBuilder mapb;
private RoleBuilder roleb;
public void setMapBuilder(MapBuilder mapb)
{
this.mapb=mapb;
}
public Map constructMap()
{
mapb.buildSky();
mapb.bulidGround();
mapb.bulidBackground();
return mapb.getMap();
}
public void setRoleBuilder(RoleBuilder roleb)
{
this.roleb=roleb;
}
public Role constructRole()
{
roleb.buildBody();
roleb.bulidSuit();
role.bulidEquip();
return roleb.getRole();
}
}

5、某系统需要提供一个加密模块,将用户信息(如密码等)加密之后再存储在数据库中,系统已经定义好数据库操作类。为了提高开发效率,现要重用已有的加密算法,这些算法由第三方提供,没有源码。如采用Adapter模式如何设计?

类图



关键类代码如下

public abstract class DataOperator
{
private String password;
public String getPassword()
{
return password;
}
public abstract String doEncrypt(int key,String ps);
}
public class CiperAdapter extends DataOperator
{
private Caesar cipher;
public cipherAdapter()
{
cipher = new Caesar();
}
public String doEncrypt(int key,String ps)
{
cipher.doEncrypt(key,ps);
}
}
public class NewCiperAdapter extends DataOperator
{
private NewCaesar newCipher;
public newCipherAdapter()
{
newCipher = new NewCaesar();
}
public String doEncrypt(int key,String ps)
{
newCipher.doEncrypt(key,ps);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: