设计模式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) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- 【转】Java中hashCode的作用
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode ...
- WebForm 生成并显示二维码
Generate and display QRCode in WebForm. 项目引用 QRCoder生成并显示 QRCode 项目引用 QRCoder How to use QRCoder Via ...
- RobotFramework自动化测试框架的基础关键字(三)
1.1.1 如何定义一个字典 此处我们说的字典,其实就等同于python语言中的字典,和列表一样,字典也是python语言中非常常用的一种数据结构,也类似于Java 语言中的Map. 在 ...
- mfc100u.dll下载和使用方法
当运行软件或游戏时,系统提示"丢失mfc100u.dll"."没有找到mfc100u.dll"等类似错误信息. 请下载本站提供的dll文件,使用它可以帮助用 ...
- 【Luogu3478】【POI2008】STA-Station(动态规划)
[Luogu3478][POI2008]STA-Station(动态规划) 题面 题目描述 给出一个\(N(2<=N<=10^6)\)个点的树,找出一个点来,以这个点为根的树时,所有点的深 ...
- HNOI2017 单旋
题目描述 网址:https://www.luogu.org/problemnew/show/3721 大意: 有一颗单旋Splay(Spaly),以key值为优先度,总共有5个操作. [1] 插入一个 ...
- [HNOI2015]亚瑟王
题面在这里 题意 \(n\)张卡按照一定顺序排列,每轮从第\(1\)张开始考虑到最后一张,考虑一张卡时有\(p[i]\)的概率产生\(d[i]\)的贡献,产生贡献时直接退出该轮并在之后的考虑中直接跳过 ...
- 小程序 - swiper除了左右切换还有上下滚动超出屏幕的内容
本来呢,我是有专门整理小程序恶心bug的文章的,每次只要添加汇总就好, 但是呢,鉴于这个问题的恶心程度,所以我把他单独拿出来说了. ---------------------------------- ...
- 在开启kerberos 后,hbase存在数据命名空间的问题(解决方案)
用hbase的超级用户 su - hbasekinit -kt /etc/security/keytabs/hbase.headless.keytab hbase-bigdata@STARYEA.CO ...
- SQL Server 历史SQL执行记录
编程执行Sql语句难免忘记保存执行的文本,或是意外设备故障多种情况的发生.对于写的简单的Sql语句丢了就丢了,但对于自己写的复杂的丢失就有些慌了, 有时候很难再次写出来,这时候就需要用一些方法找回Sq ...