zoukankan      html  css  js  c++  java
  • 设计模式第一次作业

    设计模式第一次作业

    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");
    	}
    
    }
    
    
    
  • 相关阅读:
    UVA 11991 Easy Problem from Rujia Liu(map,vector的使用)
    UVA 11995 I Can Guess the Data Structure! (STL应用)
    HDU 2795 Billboard(线段树,单点更新)
    HDU 1394 Minimum Inversion Number (线段树,单点更新)
    UVA 11827 Maximum GCD(读入技巧,stringstream的使用)
    contest 2 总结
    Const 1 总结
    开始进行大量题目练习
    函数式线段树的个人理解
    poj 2318 TOYS
  • 原文地址:https://www.cnblogs.com/zlxbky/p/7794963.html
Copyright © 2011-2022 走看看