Decorator Pattern(装饰器模式)Demo1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Decorator Pattern(装饰器模式)Demo1的主要内容,如果未能解决你的问题,请参考以下文章

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

装饰模式(Decorator Pattern)

Decorator Pattern(装饰器模式)Demo1

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

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

装饰模式(Decorator Pattern)