您的位置:首页 > 其它

设计模式第一次作业

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



增加控制台日志记录后的类图:



代码:

//主函数
public static void main(String[] args) {
LogFactory factory=new FileLogFactory();
Log log=factory.createLog();
log.writeLog();
}

//接口
public interface Log {
public void writeLog();
}
public interface LogFactory {
public Log createLog();
}

//文件
public class FileLog implements Log{
public void writeLog() {
System.out.println("写文件日志");
}
}

public class FileLogFactory implements LogFactory{
public Log createLog() {
return new FileLog();
}
}

//数据库
public class DatabaseLog implements Log{
public void writeLog() {
System.out.println("写数据库日志");
}
}

public class DatabaseLogFactory implements LogFactory{
public Log createLog() { ;
return new DatabaseLog();
}
}

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



代码:

//主函数
public static void main(String[] args) {
DatabaseFactory factory=new DB1Factory();
Connection connection=factory.CreateConnection();
Statement statement=factory.CreateStatement();
connection.CreateConnection();
statement.CreateStatement();
}

//抽象工厂类
public class abstract DatabaseFactory {
public abstract Connection CreateConnection();
public abstract Statement CreateStatement();
}

//statement对象类
public abstract class Statement {
public  void CreateStatement();
}

//connection对象类
public abstract class Connection {
public  void CreateConnection();
}

//DB1工厂类
public class DB1Factory implements DatabaseFactory{
@Override
public Connection CreateConnection() {
return new Connection1();
}

@Override
public Statement CreateStatement() {
return new Statement2();
}
}

//DB1连接对象
public class Connection1 extends Connection{
@Override
public void CreateConnection() {
System.out.println("Connection");
}
}
//DB1语句对象
public class Statement1 extends Statement{
@Override
public void CreateStatement() {
System.out.println("Statement");
}
}

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



代码:

//主函数
public static void main(String[] args) {
Waiter waiter=newWaiter(mealBuilder);
MealBuilder mealBuilder=new MealBuilder();
waiter.setMealBuilder(mealBuilder);
Meal meal=Waiter.construct();
}

/*Director*/
public class Waiter {
private MealBuilder mealBuilder;
public void setMealBuilder(MealBuilder mealBuilder){
this.mealBuilder=mealBuilder;
}
public Meal construct(){
mealBuilder.BuildFood();
mealBuilder.BuildDrink();
return mealBuilder.getMeal();
}
}

/* builder*/
public abstract class MealBuilder {
protected Meal  meal=new Meal();
public abstract void BuildFood();
public abstract void BuildDrink();
public Meal getMeal(){
return meal;
}
}

//builderA
public class MealBuilderA extends MealBuilder{
@Override
public void BuildFood() {
this.setFood("chicken");
}
@Override
public void BuildDrink() {
this.setDrink("coco");
}
}

//产品
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;
}
}

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



代码:

//Game
public class Game{
RoleBuilder rolebuilder;
MapBuilder mapbuilder;
Map map;
List<Role> RoleList;
public void Game(RoleBuilder rb,MapBuilder mb){
rolebuilder=rb;
mapbuilder=mb;
RoleList=new List<Role>();
}
public void BuildMap(){
mapbuilder.buildBackground();
mapbuilder.buildObstacle();
map=mapbuilder.getMap();
}
public void AddRole(int type){
if(type==0) rolebuilder=new Player();
else rolebuilder=new Enemy();
RoleList.Add(rolebuilder.GetRole());
}
}

//builder
public class RoleBuilder{
public Role role;
public abstract void  buildeBody();
public abstract void buildeWeapon();
public abstract void buildeClothes();
public Role getRole(){
return role;
}
}

//builder
public abstract class MapBuilder{
private Map map;
public abstract void builSky();
public abstract void buildGround();
public abstract void buildBackground();
public Map getMap(){
return map;
}
}

//实体类
public class Map{
private string sky;
private string ground;
private string background;
public void setSky(string sky) {this.sky = sky;}
public string getSky() {return sky; }
public void setGround(string ground){this.ground = ground;}
public string getGround(){ return ground;}
public void setBackGround(string background){this.background = background;}
public string getBackGround(){return background;}
}

//实体类
public class Role{
private string body;
private string cloth;
private string weapon;

public void setBody(string body)
{
this.body = body;
}
public string getBody()
{
return body;
}
public void setCloth(string cloth)
{
this.cloth = cloth;
}
public string getCloth()
{
return cloth;
}
public void setWeapon(string weapon)
{
this.weapon= weapon;
}
public string getWeapon()
{
return weapon;
}
}

public class System:MapBuilder{
public override void buildeBackground(){}
public override void buildeGround(){}
public override void buildeSky(){}
public System(){
buildeBackground();
buildeGround();
buildeSky();
}
}

public class Player:RoleBuilder{
public override void buildeClothes(){}
public override void buildeBody(){}
public override void buildeWeapon(){}
public Player(){
buildeBody();
buildeClothes();
buildeWeapon();
}
}

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



代码:

//数据操作抽象类
public abstract class DataEncrypt{
private String psw;
public String PassWord{
get { return psw; }
set { psw = value; }
}
public abstract String Encrypt(String psw);
}

//加密适配器A
public class EncryptAdapter_A : DataEncrypt{
Encrypt_A encrypt;
public EncryptAdapter_A(){
encrypt = new Encrypt_A();
}
public override string Encrypt(string psw){
return encrypt.Encrypt(psw);
}
}

//加密适配器B
public class EncryptAdapter_B : DataEncrypt{
Encrypt_B encrypt;
public EncryptAdapter_B()
{
encrypt = new Encrypt_B();
}
public override string Encrypt(string psw)
{
return encrypt.Encrypt(psw);
}
}

//加密算法A
public class Encrypt_A{
public String Encrypt(string psw){
return "EncryptA";
}
}

//加密算法B
public class Encrypt_B{
public String Encrypt(string psw){
return "EncriptB";
}
}

//主函数
static void Main(string[] args){
DataEncrypt data_en;
data_en = new EncryptAdapter_A();
data_en.PassWord = "helloworld";
Console.WriteLine(data_en.Encrypt(data_en.PassWord));
data_en = new EncryptAdapter_B();
data_en.PassWord = "helloworld";
Console.WriteLine(data_en.Encrypt(data_en.PassWord));
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: