设计模式第一次作业

设计模式第一次作业

GitHub地址:https://github.com/zlxzlxzlx/DesignPattern

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

类图:

关键类java源码及注释:

/* 
 * 抽象日志工厂类
 * */
public abstract class LogFactory {
    abstract Log createLog();
}

/*
 * 文件记录工厂类
 * */
public class FileLogFactory extends LogFactory{
    Log createLog()
    {
      
      return new FileLog();

    }
}

/*
 * 抽象日志产品类
 * */
public abstract class Log {
    abstract  void writeLog();
}

/*
 * 文件日志产品类
 * */
public class FileLog extends Log{
    void writeLog()
    {
        System.out.println("添加一个文件记录");
    }
}

/*
 * 测试类
 * */
public class test {
	public static void main(String[] args) {
    LogFactory factory=new FileLogFactory();
    Log log=factory.createLog();
    log.writeLog();
	}
}

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

类图:

关键类java源码及注释:

/*
 * 抽象的数据库工厂类
 * */
public abstract class DBFactory {
  public abstract Connection CreateConnection();
  public abstract Statement CreateStatement();
}

/*
 * Oracle数据库工厂类
 * */
public class OracleFactory extends DBFactory{

	@Override
	public Connection CreateConnection() {
		// TODO Auto-generated method stub
		return new OracleConnection();
	}

	@Override
	public Statement CreateStatement() {
		// TODO Auto-generated method stub
		return new OracleStatement();
	}

}

/*
 * 抽象的数据连接工厂类
 * */
public abstract class Connection {
    public abstract void CreateConnection();
}
/*
 * 抽象的数据语句工厂类
 * */
public abstract class Statement {
  public abstract void CreateStatement();
}

public class OracleConnection extends Connection{

	@Override
	public void CreateConnection() {
		// TODO Auto-generated method stub
		System.out.println("这是连接对象Connection");
	}

}

public class OracleStatement extends Statement{

	@Override
	public void CreateStatement() {
		// TODO Auto-generated method stub
		System.out.println("这是语句对象Statement");
	}

}

/*
 * 测试
 * */
public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
    DBFactory factory=new OracleFactory(); 
    Connection connection=factory.CreateConnection();
    Statement statement=factory.CreateStatement();
    connection.CreateConnection();
    statement.CreateStatement();
	}

}

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

类图:

关键类java源码及注释:

/*
 * 实体类
 * */
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;
}

/*
 * 抽象建造者
 * */
public abstract class MealBuilder {
	
  protected Meal  meal=new Meal();
  public abstract void BuildFood();
  public abstract void BuildDrink();
  public Meal getMeal(){
	  FoofMeal.show();
	  return meal;
  }
}

/*指挥者*/
public class KFCWaiter {
   private MealBuilder mealBuilder;
   public KFCWaiter(MealBuilder mealBuilder) {
	   this.mealBuilder=mealBuilder;
    }
   public void setMealBuilder(MealBuilder mealBuilder){
	   this.mealBuilder=mealBuilder;  
   }
   public Meal construct(){
	   mealBuilder.BuildFood();
	   mealBuilder.BuildDrink();
	return mealBuilder.getMeal();
   }
}

public class MealBuilderA extends MealBuilder{

	@Override
	public void BuildFood() {
		// TODO Auto-generated method stub
		FoofMeal.add("Hamburger");
	}

	@Override
	public void BuildDrink() {
		// TODO Auto-generated method stub
		FoofMeal.add("Coke");
	}

	
}

public class FoodMeal {

	private static ArrayList<String> foods = new ArrayList<>();

    public static void add(String food) {
        foods.add(food);
    }

    public static void show(){
        for (String food : foods) {
            System.out.println("选择的套餐"+food);
        }
    }
}
/*
 * 测试
 * */
public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
      MealBuilder mealBuilder=new MealBuilderA();
      KFCWaiter kfcWaiter=new KFCWaiter(mealBuilder);
      Meal meal=kfcWaiter.construct();
     
	}

}

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

类图:

关键类java源码及注释:

/*
 * 实体类
 * */
public class Map {
  private String sky;
  private String ground;
  private String backGround;
}

/*
 * 抽象建造者
 * */
public abstract class MapBuilder {
	 protected Map  map=new Map();
	  public abstract void BuildSky();
	  public abstract void BuildGround();
	  public abstract void BuildBackGround();
	  public Map getMap(){
		  MapP.show();
		 return map;
	  }
}

/*指挥者*/
public class MapDirector {
	 private MapBuilder mapBuilder;
	   public MapDirector(MapBuilder mapBuilder) {
		   this.mapBuilder=mapBuilder;
	    }
	   public void setMealBuilder(MapBuilder mapBuilder){
		   this.mapBuilder=mapBuilder;  
	   }
	   public Map construct(){
		   mapBuilder.BuildSky();
		   mapBuilder.BuildGround();
		   mapBuilder.BuildBackGround();
		return mapBuilder.getMap();
	   }
}

public class MapBuilderA extends MapBuilder{

	@Override
	public void BuildSky() {
		MapP.add("sky");
	}

	@Override
	public void BuildGround() {
		MapP.add("ground");
	}

	@Override
	public void BuildBackGround() {
		MapP.add("backGround");
	}

}

public class MapP {
	private static ArrayList<String> maps = new ArrayList<>();

    public static void add(String map) {
    	maps.add(map);
    }

    public static void show(){
        for (String map : maps) {
            System.out.println("地图"+map);
        }
    }
}

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		  MapBuilder mapBuilder=new MapBuilderA();
	      MapDirector mapDirector=new MapDirector(mapBuilder);
	       Map map=mapDirector.construct();
	       CharacterBuilder characterBuilder=new CharacterBuilderA();
	       CharacterDirector characterDirector=new CharacterDirector(characterBuilder);
	       Character character=characterDirector.construct();
	}

}

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

类图:

关键类java源码及注释:

public abstract class DataOperator {
  private String password;

public String getPassword() {
	return password;
}

public void setPassword(String password) {
	this.password = password;
}
abstract String doEncrypt(String password); 
}

public class PwdAdaper extends DataOperator{

	private Adaper pwd;
	public PwdAdaper()
	{
		pwd=new Adaper();
	}
	public PwdAdaper(Adaper pwd){
		this.pwd=pwd;
	}
	
	@Override
	public String doEncrypt(String password) {
		return pwd.doEncrypt(password);
	}
   
}

public class Adaper {
    public String doEncrypt(String password)
    {
		System.out.println("修改成功");
		return password;
 
    }
}

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
         PwdAdaper pwdAdaper=new PwdAdaper();
		pwdAdaper.doEncrypt("123456");
	}

}


原文地址:https://www.cnblogs.com/zlxbky/p/7794963.html