设计模式第一次作业
- 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");
}
}