为什么使用设计模式?
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些方案是大量的开发人员经过大量的实验和解决BUG所总结出来的。
开闭原则
开闭原则(OCP)是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。
案例
package com.test.fac01; public class User { private Integer uid; private String uname; public User() { } public User(Integer uid, String uname) { this.uid = uid; this.uname = uname; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } @Override public String toString() { return "User{" + "uid=" + uid + ", uname='" + uname + '\'' + '}'; } }
package com.test.fac01; public class People { private String pname; private Integer page; public People() { } public People(String pname, Integer page) { this.pname = pname; this.page = page; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Integer getPage() { return page; } public void setPage(Integer page) { this.page = page; } @Override public String toString() { return "People{" + "pname='" + pname + '\'' + ", page=" + page + '}'; } }
package com.test.fac01; public interface IUser { void insert(User user); void getByUid (Integer uid; }
package com.test.fac01; public interface IPeople { void insert(People people); void getByPid(Integer pid); }
package com.test.fac01; public class SqlserverPeople implements IPeople { @Override public void insert(People people) { System.out.println("新增一条数据" + people + "新用户" + "【SqlserverPeople】"); } @Override public void getByPid(Integer pid) { System.out.println("根据" + pid + "查询用户" + "【SqlserverPeople】"); } }
package com.test.fac01; public class SqlserverUser implements IUser { /** * TODO 新增用户 */ @Override public void insert(User user){ System.out.println("新增一条数据" + user + "新用户" + "【SqlserverUser】"); } /** * TODO 查询用户 */ @Override public void getByUid(Integer uid){ System.out.println("根据" + uid + "查询用户" + "【SqlserverUser】"); } }
package com.test.fac01; public class AsessServerUser implements IUser { @Override public void insert(User user) { System.out.println("新增一条数据" + user + "新用户" + "【AsessServerUser】"); } @Override public void getByUid(Integer uid) { System.out.println("根据" + uid + "查询用户" + "【AsessServerUser】"); } }
package com.test.fac01; public class AsessServerPeople implements IPeople { @Override public void insert(People people) { System.out.println("新增一条数据" + people + "新用户" + "【AsessServerPeople】"); } @Override public void getByPid(Integer pid) { System.out.println("根据" + pid + "查询用户" + "【AsessServerPeople】"); } }
package com.test.fac01; public class DataBase { // 数据库的选择根据下面的db进行 // private static String db = "sqlServer"; private static String db = "asessServer"; public static IUser createUser(){ IUser result = null; switch (db){ case "sqlServer": result = new SqlserverUser(); break; case "asessServer": result = new AsessServerUser(); break; } return result; } public static IPeople createPeople(){ IPeople result = null; switch (db){ case "sqlServer": result = new SqlserverPeople(); break; case "asessServer": result = new AsessServerPeople(); break; } return result; } }
package com.test.fac01; public class MainTestEasyFac { public static void main(String[] args) { /** * TODO 使用简单工厂模式 */ User u = new User(001,"张三"); IUser user = DataBase.createUser(); user.insert(u); user.getByUid(u.getUid()); People people = new People("问问",21); IPeople p = DataBase.createPeople(); p.getByPid(people.getPage()); p.insert(people); } }