设计模式NO.2
设计模式NO.2
本次博客内容为第二次设计模式的练习。根据老师的要求完成下列题目:
题目1
如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、UNIX等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式来设计。
类图设计如下:

代码实现如下:
a.视频格式抽象类
public abstract class Form {
public abstract void playForm(String os);
}
b.AVI视频格式类
public class AVI extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is AVI. OS version is "+os);
}
}
c.MPEG视频格式类
public class MPEG extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is MPEG. OS version is "+os);
}
}
d.RMVB视频格式类
public class RMVB extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is RMVB. OS version is "+os);
}
}
e.WAV视频格式类
public class WAV extends Form{
@Override
public void playForm(String os) {
System.out.println("the form of video is WAV. OS version is "+os);
}
}
f.操作系统抽象类
public abstract class OS {
protected Form m_form;
public void setForm(Form form)
{
m_form=form;
}
public abstract void play();
}
g.Windows系统类
public class Windows extends OS{
@Override
public void play() {
m_form.playForm("Windows");
}
}
h.Linux系统类
public class Linux extends OS{
@Override
public void play() {
m_form.playForm("Linux");
}
}
i.UNIX系统类
public class UNIX extends OS{
@Override
public void play() {
m_form.playForm("UNIX");
}
}
j.测试代码
public static void main(String[] args) {
Form form = new RMVB();
OS os = new Windows();
os.setForm(form);
os.play();//the form of video is RMVB. OS version is Windows
form = new AVI();
os = new Linux();
os.setForm(form);
os.play();//the form of video is AVI. OS version is Linux
}
Bridge模式小结
a.优点
桥接模式将抽象部分与它的实现部分分离开来,使他们都可以独立变化。 桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
b.适用场景
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
题目2
杀毒软件(AntiVirus)既能对系统中不同类型的文件 TextFile、ImageFile、VideoFile杀毒,也能对文件夹的杀毒,对文件夹杀毒就是对其中所包含文件的杀毒。使用Composite模式来设计。
类图设计如下:

代码实现如下:
a.抽象文件类
public abstract class Files {
public abstract void antiVirus();
}
b.TextFile类
public class TextFile extends Files
{
@Override
public void antiVirus() {
System.out.println("TextFile is antivirusing!");
}
}
c.ImageFile类
public class ImageFile extends Files{
@Override
public void antiVirus() {
System.out.println("ImageFile is antivirusing!");
}
}
d.VideoFile类
public class VideoFile extends Files{
@Override
public void antiVirus() {
System.out.println("VideoFile is antivirusing");
}
}
e.FolderFile类
import java.util.ArrayList;
public class FloderFile extends Files{
private ArrayList<Files> m_files=new ArrayList<Files>();
@Override
public void antiVirus() {
System.out.println("folder is antivirusing!");
for(Files file:m_files)
{
file.antiVirus();
}
}
public void addFile(Files file)
{
m_files.add(file);
}
public void deleteFile(Files file)
{
m_files.remove(file);
}
}
f.AntiVirus类(测试类)
public class AntiVirus {
public static void main(String[] args) {
Files file = new VideoFile();
file.antiVirus();//VideoFile is antivirusing
Files file2 = new TextFile();
file2.antiVirus();//TextFile is antivirusing!
FloderFile files = new FloderFile();
files.addFile(file);
files.addFile(file2);
files.antiVirus();
//folder is antivirusing!
//VideoFile is antivirusing
//TextFile is antivirusing!
}
}
Composite模式小结
Composite模式有两种形态:透明形态和安全形态。本文是使用安全形态实现的。
a.优点
Composite模式 定义了包含基本对象和组合对象的类层次结构,这不仅可以简化客户代码,而且使得更容易增加新类型的组件、设计变得更加一般化。
b.适用场景
- 将对象组合成树形结构以表示 “部分-整体” 的层次结构。
- 使得用户对于单个对象和组合对象的使用具有一致性。
题目3
某系统提供一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供稍复杂的逆向输出加密,还提供更为高级的求模加密。用户首先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密后的结果使用其他的加密算法进行二次加密,当然也可以进行第三次加密。使用Decrator模式来设计。
类图设计如下:

代码实现如下:
a.抽象加密接口
public interface Encryption {
public void encrypt();
}
b.字母移位加密类
public class ShiftEncryption implements Encryption{
@Override
public void encrypt() {
System.out.println("ShiftEncryption");
}
}
c.逆向输出加密类
public class ConverseEncryption extends Decrator{
public ConverseEncryption(Encryption enc) {
super(enc);
}
public void encrypt() {
m_way.encrypt();
System.out.println("ConverseEncryption");
}
}
d.求模加密类
public class ModEncryption extends Decrator{
public ModEncryption(Encryption enc) {
super(enc);
}
public void encrypt() {
m_way.encrypt();
System.out.println("ModEncryption");
}
}
e. Decrator类
public class Decrator implements Encryption{
protected Encryption m_way;
public Decrator(Encryption enc) {
m_way=enc;
}
@Override
public void encrypt() {
m_way.encrypt();
}
}
f.测试类
public class test {
public static void main(String[] args) {
Encryption enc = new ShiftEncryption();
enc = new ModEncryption(enc);
enc = new ConverseEncryption(enc);
enc = new ModEncryption(enc);
enc.encrypt();
//ShiftEncryption
//ModEncryption
//ConverseEncryption
//ModEncryption
}
}
Decrator模式小结
Decrator模式有透明和半透明两种形态。透明形态是指:装饰者不改变接口类型。半透明形态是指:装饰者改变接口类型,增加新的方法。
本文使用的是透明形态的Decrator模式。
a.优点
装饰模式可以在不改变接口的前提下动态地增强所考虑的类的性能。通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
b.适用场景
- 需要动态的给一个对象增加功能,这些功能可以再动态地撤销。
- 需要增加一些基本功能的排列组合而产生的非常大量的功能。
题目4
某系统需要提供一个文件加密模块,加密流程包括:读源文件、加密、保存加密文件。读取文件和保存文件使用流来实现,三个业务相对独立,封装在不同的类中;现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作。使用Facade模式来设计。
类图设计如下:

代码实现如下:
a.抽象Facade接口
public interface Facade {
public void Encrypt();
}
b.文件加密装饰者FacadeEncryptor
public class FacadeEncryptor implements Facade{
private Reader m_read;
private Saver m_saver;
private Encryptor m_encryptor;
public FacadeEncryptor() {
m_read = new Reader();
m_saver = new Saver();
m_encryptor = new Encryptor();
}
@Override
public void Encrypt() {
m_read.FileReade();
m_encryptor.FileEncrypt();
m_saver.FileSave();
}
}
c.读取文件类
public class Reader {
public void FileReade()
{
System.out.println("File is reading!");
}
}
d.加密文件类
public class Encryptor {
public void FileEncrypt()
{
System.out.println("File is encrypting!");
}
}
e.保存文件类
public class Saver {
public void FileSave()
{
System.out.println("File is saving!");
}
}
f.测试类
public class Client {
public static void main(String[] args) {
Facade fac = new FacadeEncryptor();
fac.Encrypt();
//File is reading!
//File is encrypting!
//File is saving!
}
}
Facade模式小结
a.优点
- 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。
- 实现了子系统与客户之间的松耦合关系。
- 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
b.适用场景
- 需要为一个复杂子系统提供一个简单接口时。
- 客户程序与抽象类的实现部分之间存在着很大的依赖性。
- 需要构建一个层次结构的子系统时。
题目5
某论坛已注册用户和游客的权限不同,已注册用户拥有发帖、修改自己的注册信息等功能;游客只能看别人的帖子,没有其他权限。使用Proxy模式来设计。
类图设计如下:

代码实现如下:
a.抽象用户类
public abstract class User {
public abstract void view();
public abstract void post();
public abstract void modify();
}
b.注册用户类
public class realUser extends User{
@Override
public void view() {
System.out.println("please view nicely!");
}
@Override
public void post() {
System.out.println("please post nicely!");
}
@Override
public void modify() {
System.out.println("please modify rightly!");
}
}
c.游客类
public class visitor extends User{
private User user;
public visitor(User user)
{
this.user=user;
}
@Override
public void view() {
user.view();
}
@Override
public void post() {
System.out.println("please login!");
}
@Override
public void modify() {
System.out.println("please login!");
}
}
d.测试类
public class Client {
public static void main(String[] args) {
User u1 = new realUser();
u1.view();//please view nicely!
u1.post();//please post nicely!
u1.modify();//please modify rightly!
u1 = new visitor(u1);
u1.view();//please view nicely!
u1.post();//please login!
u1.modify();//please login!
}
}
Proxy模式小结
a.优点
- 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
- 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
b.适用场景
- 需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理。
- 需要控制对原始对象的访问的时候,可以使用保护代理。
- 需要在访问对象执行一些附加操作的时候,可以使用智能指引代理。
需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理。
设计模式NO.2的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- EF6CodeFirst+MVC5+Autofac泛型注册 入门实例
贴一个EF6 CodeFirst模式结合MVC5和Autofac(泛型注册)的一个入门实例 网上类似的例子实在太少,最近自己也有用到这一块的知识,总结了一下,不要让后人踩了自己踩过的坑. 1:新建三个 ...
- 一次断电后docker问题的排解
这篇文章是一次真实的排查经历,可能对大多数人没什么作用,慎看. 断电后来电,服务器启动,手工启动各个docker,大部分正常,小部分还是出错,错误信息: <html> <head&g ...
- data数据不一致的问题
经常会遇到that.data能打印出来(能访问到),而that.data.xxx不能打印(为空)的情况.特别是在调用了云方法,然后setData的时候,为什么会出现这样的情况不明. 解决方法,将需要用 ...
- golang channel的使用以及调度原理
golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...
- Go实现短url项目
首先说一下这种业务的应用场景: 把一个长url转换为一个短url网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长url的地址转换为短url地址 通过短url获取对应的原始长u ...
- python web开发-flask中的url带斜线和不带斜线区别详解
通过flask进行路由配置的时候,有一个细节,就是同样的url,带上"/"和不带"/"有什么区别. 举例说明: 比如有个url,名字为"/url&qu ...
- Spring之<context:property-placeholder location="classpath:... "/>标签路径问题
<context:property-placeholder location="classpath:... "/>中classpath:是src目录下的意思:所以加载 ...
- unix及Linux发展历程
unix及Linux发展历程 版权申明:本文资料为网上收集,由本人整理而成,转载请注明 一,unix诞生: Ken Thompson肯·汤普森 -------- unix之父 在1969年到1970间 ...
- 浅析JavaScript的prototype
一.JavaScript对象的创建 (1)对象方法 function Student(name){ this.name=name; this.showName=function(){ alert(&q ...
- Java设计模式(六)Adapter适配器模式
一.场景描述 “仪器数据采集器”包含采集数据以及发送数据给服务器两行为,则可定义“仪器数据采集器”接口,定义两方法“采集数据capture”和“发送数据sendData”. “PDF文件数据采集器”实 ...