zoukankan      html  css  js  c++  java
  • 设计模式第一次练习

    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);
    	}
    }
    
  • 相关阅读:
    WinSCP 与 Putty 中文显示乱码解决方法
    centos 6.2上oracle 11g的远程安装
    CentOs 6.3_64静默安装oracle11g_r2
    IP地址修改后ORACLE不能使用问题
    linux查看本机IP、gateway、dns
    linux启动SSH及开机自动启动
    linux下如何从自动获取ip转到手动配置ip
    Linux系统(CentOS 6.4)的NTFS驱动NTFS3g的安装和配置
    正则表达式——去除文本中的非汉字(VB2005)
    遍历排列的实现——VB2005
  • 原文地址:https://www.cnblogs.com/liminghuang/p/7788604.html
Copyright © 2011-2022 走看看