博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式第一次作业
阅读量:5251 次
发布时间:2019-06-14

本文共 5300 字,大约阅读时间需要 17 分钟。

设计模式第一次作业

1.用户可以根据要求动态选择日志记录方式。使用Factory模式来设计;如果系统中增加一个日志记录方式—控制台日志记录(ConsoleLog),类图将如何改变?

1249115-20171106102843809-994133519.png

抽象工厂

public abstract class RecordFactory {    abstract Record createRec();}

文件工厂

public class DocFactory extends RecordFactory {    @override    Record createRec() {        return new DocRecord();        }}

数据库工厂

public class DbFactory extends RecordFactory {    @override    Record createRec() {        return new DbRecord();        }}

抽象的产品

abstract class Record {    abstract void operate();}

文件产品

public class DocRecord extends Record{    @override    void operate() {        System.out.println("DocRecordOperate");    }}

数据库产品

public class DbRecord extends Record{    @override    void operate() {        System.out.println("DbRecordOperate");    }}

增加了控制台记录的类图

1249115-20171106103749872-1165066352.png

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

1249115-20171106103857872-735369711.png

抽象工厂类

public abstract class DbFactory {    abstract Statement createStatement();    abstract Connection createConnection();}

MySql工厂类

public class MySqlFactory extends DbFactory{    @override    Statement createStatement() {        return new MySqlStatement;    }    Connection createConnection() {        return new MySqlConnection;    }}

Oracle工厂类

public class OracleFactory{    @override    Statement createStatement() {        return new OracleStatement;    }    Connection createConnection() {        return new OracleConnection;    }}

SqlServer工厂类

public class SqlServerFactory{    @override    Statement createStatement() {        return new SqlServerStatement;    }    Connection createConnection() {        return new SqlServerConnection;    }}

Statement语句对象类

public abstract class Statement {    abstract void operate();}

Connection连接对象类

public abstract class Connection {    abstract void connect();}

MySql语句对象

public class MySqlStatement extends Statement{    @override    public void operate() {        System.out.println("MySqlStatement");    }}

MySql连接对象

public class MySqlConnection extends Connection{    @override    public void connect() {        System.out.println("MySqlConnection");    }}

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

1249115-20171106104759184-1005400554.png

抽象建造类

public abstract class CombinationBuilder {    private Combination com;    public abstract void buildFood();    public abstract void buildDrink();        public Combination() {        return com;    }}

到眼类

public class Director{    public void build(CombinationBuilder comBuilder) {        comBuilder.buildDrink();        comBuilder.buildFood();    }}

普通套餐类

public class NormalCombination extends CombinationBuilder{    @override    void buildFood() {        com.add("whateverFood");    }        void buildDrink() {        com.add("whateverDrink");    }}

套餐类

public class Combination{    private List
list = new LinkedList
(); public void add(String thing) { list.add(thing); } public void show() { System.out.println("combination"); }}

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

1249115-20171106113939013-255361770.png

导演类

public class LevelDirector{    public void buildMap(MapBuilder mapBuilder) {        mapBuilder.buildSky();        mapBuilder.buildTerrain();        mapBuilder.buildBackground();    }    public void buildRole(RoleBuilder roleBuilder) {        roleBuilder.buildBody();        roleBuilder.buildOutfit();        roleBuilder.buildArmer();    }}

地图构建类

public abstract class MapBuilder {    private Map map;    public abstract void buildSky();    public abstract void buildTerrain();    public abstract void buildBackground();        public Map getMap() {        return map;    }}

角色构建类

public abstract class RoleBuilder {    private Player role;    public abstract void buildBody();    public abstract void buildOutfit();    public abstract void buildArmer();        public Map getRole() {        return role;    }}

菜鸟角色构建类

public class NoobRole extends RoleBuilder{    @override    void buildBody() {        Role.add("WeakBody");    }        void buildOutfit() {        Role.add("Original-Outfit");    }    void buildArmer() {        Role.add("Original-Armer");    }}

玩家类

public class Player{    List
list = new LinkedList
(); public void add(String thing) { list.add(thing); } public void show() { System.out.println("Player"); }}

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

1249115-20171106164756903-240361200.png

原有接口

public interface NoEncryption {    void encrypt();}

数据库类

public class DataBase{    private NoEncryption noEncryption;        public DataBase() {}        public DataBase(NoEncryption noEncryption) {        this.noEncryption=noEncryption;    }    public void setEncryption(NoEncryption noEncryption) {        this.noEncryption=noEncryption;    }        public void encrypt() {        System.out.println("noEncryption");    }}

适配体类

public class Adaptee{    public void encrypt() {        System.out.println("Encryption");    }}

适配器类

public class EncryptionAdapter implements NoEncryption{    private Adaptee adaptee;        public EncryptionAdapter(Adaptee adaptee) {        this.adaptee=adaptee;    }        public void encrypt() {        System.out.println("Encryption");    }}

转载于:https://www.cnblogs.com/xiezhe1204/p/7791947.html

你可能感兴趣的文章
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
用CALayer实现下载进度条控件
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
java string
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
JAVA跨域CORS
查看>>
正确的在循环list的时候删除list里面的元素
查看>>
ERP渠道文档详细和修改(二十五)
查看>>
C#正则Groups高级使用方法
查看>>
ecshop安装常见问题及解决办法
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>
ip相关问题解答
查看>>
第九周作业
查看>>
Postman—添加断言和检查点
查看>>