Decorator Pattern(装饰器模式)Demo1

一个简单的装饰器模式例子,用来体现直接查询,缓存查询,和过滤敏感词汇

  1 import java.sql.Connection;
  2 import java.sql.PreparedStatement;
  3 import java.sql.ResultSet;
  4 import java.sql.SQLException;
  5 import java.util.ArrayList;
  6 import java.util.HashMap;
  7 import java.util.List;
  8 import java.util.Map;
  9 import util.DBConnection;
 10
 11 /**
 12  *
 13  * @author NevinYang
 14  */
 15 class Student { // 查询结果类,相当于一个JavaBean
 16
 17     private String Stu_id;
 18     private String Stu_name;
 19     private String Stu_sex;
 20     private String Stu_grade;
 21     private int Col_id;
 22     private int Pro_id;
 23
 24     public String getStu_id() {
 25         return Stu_id;
 26     }
 27
 28     public void setStu_id(String Stu_id) {
 29         this.Stu_id = Stu_id;
 30     }
 31
 32     public String getStu_name() {
 33         return Stu_name;
 34     }
 35
 36     public void setStu_name(String Stu_name) {
 37         this.Stu_name = Stu_name;
 38     }
 39
 40     public String getStu_sex() {
 41         return Stu_sex;
 42     }
 43
 44     public void setStu_sex(String Stu_sex) {
 45         this.Stu_sex = Stu_sex;
 46     }
 47
 48     public String getStu_grade() {
 49         return Stu_grade;
 50     }
 51
 52     public void setStu_grade(String Stu_grade) {
 53         this.Stu_grade = Stu_grade;
 54     }
 55
 56     public int getCol_id() {
 57         return Col_id;
 58     }
 59
 60     public void setCol_id(int Col_id) {
 61         this.Col_id = Col_id;
 62     }
 63
 64     public int getPro_id() {
 65         return Pro_id;
 66     }
 67
 68     public void setPro_id(int Pro_id) {
 69         this.Pro_id = Pro_id;
 70     }
 71
 72     @Override
 73     public String toString() {
 74         return "Student{" + "Stu_id=" + Stu_id + ", Stu_name=" + Stu_name + ", Stu_sex=" + Stu_sex + ", Stu_grade=" + Stu_grade + ", Col_id=" + Col_id + ", Pro_id=" + Pro_id + ‘}‘;
 75     }
 76 }
 77
 78 interface Query { // 查询接口,有简单查询和缓存查询
 79
 80     public Student query(String sql);
 81 }
 82
 83 class SimpleQuery implements Query { // 简单查询,相当于直接查询数据库,这里直接返回Result,相当于是数据库查询的结果
 84
 85     @Override
 86     public Student query(String sql) {
 87         Student student = new Student();
 88         Connection conn = DBConnection.getConnection();
 89         PreparedStatement pstmt = null;
 90         ResultSet rs = null;
 91         try {
 92             pstmt = conn.prepareStatement(sql);
 93             rs = pstmt.executeQuery();
 94             if (rs.next()) {
 95                 student.setStu_id(rs.getString(1));
 96                 student.setStu_name(rs.getString(2));
 97                 student.setStu_sex(rs.getString(3));
 98                 student.setStu_grade(rs.getString(4));
 99                 student.setCol_id(rs.getInt(5));
100                 student.setPro_id(rs.getInt(6));
101             }
102
103         } catch (SQLException e) {
104             System.out.println("操作中出现错误:" + e.getMessage());
105         } finally {
106             DBConnection.close(conn, pstmt, rs);
107         }
108         return student;
109     }
110 }
111
112 class CacheQuery implements Query { // 缓存查询,如果查询相同的sql,不直接查询数据库,而是返回map中存在的Result
113
114     private Query query;
115     private Map<String, Student> cache = new HashMap<>();
116
117     public CacheQuery(Query query) {
118         //此时这个query就为SimpQuery
119         this.query = query;
120     }
121
122     @Override
123     public Student query(String sql) {
124         if (cache.containsKey(sql)) {
125             return cache.get(sql);
126         }
127         Student student = query.query(sql);
128         System.out.println("执行了推入操作");
129         cache.put(sql, student);
130         return student;
131     }
132 }
133
134 class FilterQuery implements Query {
135     //过滤敏感词汇
136     private Query query;
137     private List<String> words = new ArrayList<>();
138
139     public FilterQuery(Query query) {
140         this.query = query;
141         words.add("杨晓龙");
142         words.add("杨晓亮");
143     }
144
145     @Override
146     public Student query(String sql) {
147         for (String word : words) {
148             if (sql.contains(word)) {
149                 return null;
150             }
151         }
152         return query.query(sql);
153     }
154 }
155
156 public class Test {
157
158     public static void main(String args[]) {
159
160         Query simpleQuery = new SimpleQuery();
161         Student student1 = simpleQuery.query("SELECT * FROM student WHERE Stu_id=1");
162         Student student2 = simpleQuery.query("SELECT * FROM student WHERE Stu_id=2");
163         System.out.println(student1);
164         System.out.println(student2);
165         System.out.println(student1 == student2);
166         System.out.println("---------------------------------------");
167
168         Query cacheQuery = new CacheQuery(simpleQuery);
169         Student student3 = cacheQuery.query("SELECT * FROM student WHERE Stu_id=1");
170         Student student4 = cacheQuery.query("SELECT * FROM student WHERE Stu_id=1");
171         System.out.println(student3);
172         System.out.println(student4);
173         System.out.println(student3 == student4);
174         System.out.println("---------------------------------------");
175
176         Query filterQuery = new FilterQuery(simpleQuery);
177         Student filter1 = filterQuery.query("SELECT * FROM student WHERE Stu_name=‘杨晓龙‘");  // null
178         System.out.println(filter1);
179         Student filter2 = filterQuery.query("SELECT * FROM student WHERE Stu_name=‘杨晓亮‘");  // null
180         System.out.println(filter2);
181
182     }
183 }

对数据库的操作类:

 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.PreparedStatement;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6
 7 /**
 8  *
 9  * @author NevinYang
10  */
11 public class DBConnection {
12
13     public static Connection getConnection() {
14         Connection conn = null;
15         try {
16             Class.forName("com.mysql.jdbc.Driver");//帮助建立连接
17             String username = "root";
18             String password = "123456";
19             String url = "jdbc:mysql://localhost:3306/student?"
20                     + "useUnicode=true&characterEncoding=UTF-8";
21             conn = DriverManager.getConnection(url, username, password);
22         } catch (ClassNotFoundException e) {
23             System.out.println(e.getMessage());
24         } catch (SQLException e) {
25             System.out.println(e.getMessage());
26         }
27         return conn;
28     }
29
30     public static void close(Connection conn,
31             PreparedStatement pstmt, ResultSet rs) {
32         try {
33             //判断rs 等是否为空?
34             //如果为空会出现空指针异常
35             if (rs != null) {
36                 rs.close();
37             }
38             if (pstmt != null) {
39                 pstmt.close();
40             }
41             if (conn != null) {
42                 conn.close();
43             }
44
45         } catch (Exception e) {
46             e.printStackTrace();
47         }
48     }
49 }

数据库创建语句:

create table student(
    Stu_id varchar(32) NOT NULL,
    Stu_name varchar(32) DEFAULT NULL,
    Stu_sex varchar(32) DEFAULT NULL,
    Stu_grade varchar(32) DEFAULT NULL,
    Col_id int NOT NULL,
    Pro_id int NOT NULL,
    PRIMARY KEY (Stu_id)
) DEFAULT CHARSET=utf8
时间: 2024-10-07 06:55:12

Decorator Pattern(装饰器模式)Demo1的相关文章

设计模式 —— 装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern) 概念 装饰器模式 允许向一个现有的对象添加新的功能,同时又不改变其结构.装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的. 组成 装饰器模式由组件和装饰者组成. 抽象组件(Component):需要装饰的抽象对象. 具体组件(ConcreteComponent):是我们需要装饰的对象 抽象装饰类(Decorator):内含指向抽象组件的引用及装饰者共有的方法. 具体装饰类(ConcreteDecorator):被装饰的对

23种设计模式之装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 通过采用组合.而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能.避免了单独使用继承带来的“灵活性差"和"多子类衍生问题". 优点:装饰类和被装饰类可以独立发

设计模式之装饰器模式(decorator pattern)

装饰器模式主要对现有的类对象进行包裹和封装,以期望在不改变类对象及其类定义的情况下,为对象添加额外功能.是一种对象结构型模式.需要注意的是,该过程是通过调用被包裹之后的对象完成功能添加的,而不是直接修改现有对象的行为,相当于增加了中间层.类似于python中的@装饰器. 下面还是按照老规矩,先来了解一下该模式相关的概念和原理,然后通过两个具体的实例体会一下如何在实际开发中应用该模式. 1. 目的 可以动态的为同一类的不同对象加以修饰以添加新的功能. 2. 动机 灵活的对类对象功能进行扩展. 3.

设计模式(三)——装饰器模式(Decorator Pattern)

发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装潢吧,比如刚买的毛坯房,只有一个没有门,直接就可以进去. 首先设计一个房子类Room,实现一个进入方法Access /// <summary> /// 抽象接口 用来进行约束 /// </summary> public interface IAccess { void Access()

设计模式入门之装饰器模式Decorator

//装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Component:组件对象的接口.能够给这些对象动态加入职责 //ConcreateComponet:详细的组件对象.实现组件对象接口.通常就是被装饰器装饰的对象.也就是能够给这个对象加入职责 //Decorator:全部装饰器的抽象父类,须要定义一个与组件接口一致的接口,并持有一个Component对象,

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

Java设计模式——装饰器模式(Decorator)

孙悟空有七十二般变化,他的每一种变化都给他带来一种附加本领.而不管孙悟空怎么变化在二郎神眼里,他永远是那只猢狲. 装饰器模式以对客户透明的方式动态的给一个对象附加上更多的责任. 在孙悟空的例子里,老孙变成的鱼儿相当于老孙的子类. 装饰模式的类图如下: 装饰模式的角色介绍: 抽象构件角色(ComponentDec):给出一个抽象接口,以规范准备接收附加责任的对象 具体构件(Concrete ComponentDec):定义一个将要接收附加责任的类 装饰角色(Decortor):持有一个构件对象的实

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

Decorator模式 装饰器模式

Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办