设计模式NO.1

根据作业要求完成下列题目:

题目1:

(1)要求:某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等;用户可以根据要求动态选择日志记录方式。使用Factory模式来设计;

类图如下所示:



实现代码如下:

a.抽象工厂

public abstract class LogFactory {
abstract Log logCreate(); }

b. 抽象日志

public abstract class Log {
abstract void add();
abstract void delete();
abstract void update(); }

c.文件日志工厂类

public class FileFactory extends LogFactory{

	@Override
Log logCreate() {
return new FileLog();
} }

d.数据库日志工厂类

public class DBFactory extends LogFactory{

	@Override
Log logCreate() {
return new DBLog();
} }

e.文件日志产品类

public class FileLog extends Log{

	@Override
void add() {
System。out.println("add by FileLog!"); } @Override
void delete() {
System。out.println("delete by FileLog!"); } @Override
void update() {
System。out.println("update by FileLog!"); } }

f.数据库日志产品类

public class DBLog extends Log{

	@Override
void add() {
System。out.println("add by DBLog!"); } @Override
void delete() {
System。out.println("delete by DBLog!"); } @Override
void update() {
System。out.println("update by DBLog!"); } }

(2)如果系统中增加一个日志记录方式—控制台日志记录(ConsoleLog),类图将如何改变?

改变后的类图如下:

题目2

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

类图设计如下:



实现代码如下:

a. 抽象Connection产品类

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

b.MySqlConnection产品类

public class MySqlConnection extends Connection{

	@Override
void connect() {
System.out.println("this is MysqlConnection"); } }

c.OrcaleConnection产品类

public class OrcaleConnection extends Connection{

	@Override
void connect() {
System.out.println("this is OrcaleConnection");
} }

d.抽象Statement产品类

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

e.MySqlStatement产品类

public class MySqlStatement extends Statement{

	@Override
void statement() {
System.out.println("this is MySqlStatement");
} }

f.OrcaleStatement产品类

public class OrcaleStatement extends Statement{

	@Override
void statement() {
System.out.println("this is OrcaleStatement");
} }

g.抽象工厂类DBFactory

public abstract class DBFactory {
abstract Connection getConnect();
abstract Statement getStatement();
}

h.MySql工厂类

public class MySqlFactory extends DBFactory{

	@Override
Connection getConnect() {
return new MySqlConnection();
} @Override
Statement getStatement() {
return new MySqlStatement();
} }

i.Orcale工厂类

public class OrcaleFactory extends DBFactory{

	@Override
Connection getConnect() {
return new OrcaleConnection();
} @Override
Statement getStatement() {
return new OrcaleStatement();
} }

题目3

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

设计的类图如下:



实现代码如下:

a.套餐类

public class KFCPackage {
private String food="";
private String drink="";
public void addFood(String Food)
{
food+=Food;
}
public void addDrink(String Drink)
{
drink+=Drink;
}
public void show()
{
System.out.println("your order is:\n food:"+food+"\n drink:"+drink);
} }

b.抽象建造者类

public abstract class KFCBuilder {
abstract void BuilderFood();
abstract void BuilderDrink();
abstract KFCPackage getPackage(); }

c.建造者A类

public class KFCBuilderA extends KFCBuilder{
private KFCPackage m_package; public KFCBuilderA() {
m_package=new KFCPackage();
} @Override
void BuilderFood() {
m_package.addFood("牛肉海鲜堡"); } @Override
void BuilderDrink() {
m_package.addDrink("冰霜柠檬汁"); } @Override
KFCPackage getPackage() {
return m_package;
} }

d.建造者B类

public class KFCBuilderB extends KFCBuilder{

	private KFCPackage m_package;

	public KFCBuilderB() {
m_package=new KFCPackage();
} @Override
void BuilderFood() {
m_package.addFood("鸡腿鲤鱼堡"); } @Override
void BuilderDrink() {
m_package.addDrink("极地冰霜鲜橙汁"); } @Override
KFCPackage getPackage() {
return m_package;
}
}

e.侍者类

public class KFCWaiter {
private KFCBuilder br;
public void setBuilder(KFCBuilder br)
{
this.br=br;
}
public KFCPackage construct()
{
br.BuilderFood();
br.BuilderDrink();
return br.getPackage();
}
}

题目4

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

类图设计如下:



代码实现如下:

a.Map类

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 void show()
{
System.out.println("Map:\n sky: "+sky+"\n ground: "+ground+"\n background: "+background);
} }

b.Person类

public class Person {
private String clothes;
private String body;
private String equipment;
public void setClothes(String clothes) {
this.clothes=clothes;
}
public void setBody(String body) {
this.body=body;
}
public void setEquipment(String equipment) {
this.equipment=equipment;
}
public void show() {
System.out.println("Person:\n body: "+body+"\n clothes: "+clothes+"\n equipment: "+equipment);
}
}

c.抽象Map建造者类

public abstract class MapBuilder {

	abstract void BuilderSky();
abstract void BuilderGround();
abstract void BuilderBackGround();
abstract Map getMap(); }

d.抽象Person建造者类

public abstract class PersonBuilder {

	abstract void BuliderClothes();
abstract void BuiderBody();
abstract void BuilderEquipment();
abstract Person getPerson(); }

e.Map建造者A类

public class MapBuilderA extends MapBuilder{
private Map m_map;
public MapBuilderA() {
m_map= new Map();
}
@Override
void BuilderSky() {
m_map.setSky("湛蓝"); }
@Override
void BuilderGround() {
m_map.setGround("广阔原野"); }
@Override
void BuilderBackGround() {
m_map.setBackground("无尽麦田"); }
@Override
Map getMap() {
return m_map;
} }

f.Person建造者A类

public class PersonBuilderA extends PersonBuilder{
private Person m_person;
public PersonBuilderA() {
m_person= new Person();
}
@Override
void BuliderClothes() {
m_person.setClothes("粉饰红装"); }
@Override
void BuiderBody() {
m_person.setBody("婀娜多姿"); }
@Override
void BuilderEquipment() {
m_person.setEquipment("琵琶"); }
@Override
Person getPerson() { return m_person;
} }

g.MapDirector类

public class MapDirector {
private MapBuilder m_mb;
public void setMapBuilder(MapBuilder m_mb)
{
this.m_mb=m_mb;
}
public Map construct()
{
m_mb.BuilderSky();
m_mb.BuilderGround();
m_mb.BuilderBackGround();
return m_mb.getMap();
}
}

h.PersonDirector类

public class PersonDirector {
PersonBuilder m_pb;
public void setBuilder(PersonBuilder m_pb)
{
this.m_pb=m_pb;
}
public Person construct()
{
m_pb.BuiderBody();
m_pb.BuliderClothes();
m_pb.BuilderEquipment();
return m_pb.getPerson();
} }

题目5

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

类图设计如下:



实现代码如下:

a.加密方法调用接口

public interface Encryption {
public String encrypt(String str); }

b.适配器类

public class Adapter implements Encryption{
NewEncrypt m_newEnc;
public Adapter(NewEncrypt m_newEnc)
{
this.m_newEnc=m_newEnc;
}
public void setEncrypt(NewEncrypt m_newEnc)
{
this.m_newEnc=m_newEnc;
} @Override
public String encrypt(String str) {
return m_newEnc.encrypt(str);
}
}

c.原先的加密算法类

public class ActualEncrypt implements Encryption{

	@Override
public String encrypt(String str) {
str+="已被加密";
return str;
} }

d.新的加密算法类

public class NewEncrypt {

	public String encrypt(String str)
{
return str+="已被新的加密方法加密";
}
}

设计模式NO.1的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. 消息队列mq的原理及实现方法

    消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行前不需要等待 ...

  2. webpack学习(一):webpack 介绍&安装&常用命令

    一.简单介绍 什么是Webpack Webpack是一款用户打包前端模块的工具,它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 主要是用来打包在浏览器端使用的ja ...

  3. 【Luogu1876】开灯(数论)

    [Luogu1876]开灯(数论) 题面 题目描述 首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的 ...

  4. 【NOIP2016】蚯蚓(队列,单调性)

    题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个 ...

  5. SPOJ:To the moon

    题面 vjudge Sol 主席树模板 # include <bits/stdc++.h> # define RG register # define IL inline # define ...

  6. 圆方树简介(UOJ30:CF Round #278 Tourists)

    我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个 ...

  7. [BZOJ1051] [HAOI2006] 受欢迎的牛 (强联通分量)

    Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...

  8. 对网易云音乐参数(params,encSecKey)的分析

    我们如果对网易云音乐进行爬虫的话,我们会发现,提交的参数是(params,encSecKey),然而这两个参数是一串很长的东西 我们要对网易云进行爬虫,那么就一定要将这两个参数弄明白,然后才可以进行爬 ...

  9. MySQL多数据源笔记1-MySQL主从复制

    1.为什么要做主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出 ...

  10. 怎么用secureCRT连接Linux

    首先要安装linux,参看:http://www.cnblogs.com/shenjieblog/p/5061282.html 然后要安装secureCRT,参看:http://www.cnblogs ...