设计模式第一次练习

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);
	}
}
posted @ 2017-11-05 20:31  McHades  阅读(993)  评论(0编辑  收藏  举报