夜光序言:
又下雨了,如果你在眼前,我可能会说,我恨你,如果你不在,我更想说,我想你了。
正文:
以道御术 / 以术识道
package 开闭原则;
public class Ocp {
public static void main(String[] args) {
//使用看看,存在的问题
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
}
}
//下面写一个用于绘图的类
class GraphicEditor{
//夜光:接收shape对象,然后来绘制不同的图形
public void drawShape(Shape s){
if (s.m_type == 1)
drawRectangle(s);
else if(s.m_type == 2)
drawCircle(s);
}
public void drawRectangle(Shape r){
System.out.println(" 绘制矩形");
}
public void drawCircle(Shape r){
System.out.println(" 绘制圆形");
}
}
//这里,我们定义了一个Shape类,基类
class Shape{
int m_type;
}
class Rectangle extends Shape{
Rectangle(){
super.m_type = 1;
}
}
class Circle extends Shape{
Circle(){
super.m_type = 2;
}
}
package 开闭原则;
public class Ocp {
public static void main(String[] args) {
//使用看看,存在的问题
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawShape(new Triangle());
}
}
//下面写一个用于绘图的类
class GraphicEditor{
//夜光:接收shape对象,然后来绘制不同的图形
public void drawShape(Shape s){
if (s.m_type == 1)
drawRectangle(s);
else if(s.m_type == 2)
drawCircle(s);
else if(s.m_type == 3)
drawTriangle(s);
}
//绘制矩形
public void drawRectangle(Shape r){
System.out.println(" 绘制矩形");
}
//绘制圆形
public void drawCircle(Shape r){
System.out.println(" 绘制圆形");
}
//绘制圆形
public void drawTriangle(Shape r){
System.out.println(" 绘制三角形");
}
}
//这里,我们定义了一个Shape类,基类
class Shape{
int m_type;
}
class Rectangle extends Shape{
Rectangle(){
super.m_type = 1;
}
}
class Circle extends Shape{
Circle(){
super.m_type = 2;
}
}
//新增画三角形
class Triangle extends Shape{
Triangle(){
super.m_type = 3;
}
}
package 开闭原则.分析;
public class Ocp {
public static void main(String[] args) {
//使用看看,存在的问题
GraphicEditor graphicEditor = new GraphicEditor();
graphicEditor.drawShape(new Rectangle());
graphicEditor.drawShape(new Circle());
graphicEditor.drawShape(new Triangle());
graphicEditor.drawShape(new OtherGraphic());
}
}
//下面写一个用于绘图的类
class GraphicEditor{
//夜光:接收shape对象,然后来绘制不同的图形
public void drawShape(Shape s){
s.draw();
}
}
//这里,我们定义了一个Shape类,基类
//定义为抽象方法
abstract class Shape{
int m_type;
public abstract void draw(); //抽象方法
}
class Rectangle extends Shape {
Rectangle(){
super.m_type = 1;
}
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
class Circle extends Shape {
Circle(){
super.m_type = 2;
}
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
//新增画三角形
class Triangle extends Shape {
Triangle(){
super.m_type = 3;
}
@Override
public void draw() {
System.out.println("绘制三角形");
}
}
//其他图形
class OtherGraphic extends Shape{
OtherGraphic(){
super.m_type = 4;
}
@Override
public void draw() {
System.out.println("绘制其他图形");
}
}
在方法前边写:/+快捷键名+Tab键。
即可,比如我设置的快捷键方法名是a
package 迪米特法则;
import java.util.ArrayList;
import java.util.List;
//夜光:写一个类来介绍一下迪米特法则
//客户端
public class Demeter {
public static void main(String[] args) {
//new一个对象
SchoolManager schoolManager = new SchoolManager();
//调用其方法
schoolManager.printAllEmployee(new CollegeManager()); //传入一个对象CollegeManager
}
}
//学校总部员工
class Employee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
//学院的员工
class CollegeEmployee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
//我们写一个类
//管理学院员工的管理类
class CollegeManager{
//返回学院的所有员工
/**
* @Description:
* @Param: []
* @return: java.util.List<迪米特法则.CollegeEmployee>
* @Author: Hy
* @Date: 2019/11/28
*/
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) { //这里我们增加十个员工到list
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id= " + i);
list.add(emp);
}
return list;
}
}
class SchoolManager{
/**
* @Description:
* @Param: []
* @return: java.util.List<迪米特法则.Employee>
* @Author: Hy
* @Date: 2019/11/28
*/
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for(int i=0;i<5;i++){ //这里我们增加五个员工到list
Employee emp = new Employee();
emp.setId("学院总部员工id= " + i);
list.add(emp);
}
return list;
}
/**
* @Description: 该方法完成输出学校总部和学院员工信息
* @Param: [sub]
* @return: void
* @Author: Hy
* @Date: 2019/11/28
*/
void printAllEmployee(CollegeManager sub){
List<CollegeEmployee> list1 = sub.getAllEmployee();
System.out.println("----------------------分公司员工-------------------------");
for(CollegeEmployee e : list1){
System.out.println(e.getId());
}
List<Employee> list2 = this.getAllEmployee();
System.out.println("-------------------学校总部员工-------------------------");
for(Employee e : list2){
System.out.println(e.getId());
}
}
}
package 迪米特法则.improve;
import java.util.ArrayList;
import java.util.List;
//夜光:写一个类来介绍一下迪米特法则
//客户端
public class Demeter {
public static void main(String[] args) {
System.out.println("使用迪米特法则之后的改进~~~");
//new一个对象
SchoolManager schoolManager = new SchoolManager();
//调用其方法
//输出了学院总部的员工id 和 学院的员工id
schoolManager.printAllEmployee(new CollegeManager()); //传入一个对象CollegeManager
}
}
//学校总部员工
class Employee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
//学院的员工
class CollegeEmployee{
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
//我们写一个类
//管理学院员工的管理类
class CollegeManager{
//返回学院的所有员工
/**
* @Description:
* @Param: []
* @return: java.util.List<迪米特法则.CollegeEmployee>
* @Author: Hy
* @Date: 2019/11/28
*/
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) { //这里我们增加十个员工到list
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id= " + i);
list.add(emp);
}
return list;
}
//输出学院员工的信息
public void printEmployee(){
/* List<CollegeEmployee> list1 = sub.getAllEmployee();*/
List<CollegeEmployee> list1 = this.getAllEmployee();
System.out.println("----------------------分公司员工-------------------------");
for(CollegeEmployee e : list1){
System.out.println(e.getId());
}
}
}
//夜光:我们来分析一下
//分析SchoolManager的直接朋友有哪些 Employee(成员变量)、CollegeManager
//CollegeEmployee不是直接的朋友,这样违背了迪米特法则
class SchoolManager{
/**
* @Description:
* @Param: []
* @return: java.util.List<迪米特法则.Employee>
* @Author: Hy
* @Date: 2019/11/28
*/
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for(int i=0;i<5;i++){ //这里我们增加五个员工到list
Employee emp = new Employee();
emp.setId("学院总部员工id= " + i);
list.add(emp);
}
return list;
}
/**
* @Description: 该方法完成输出学校总部和学院员工信息
* @Param: [sub]
* @return: void
* @Author: Hy
* @Date: 2019/11/28
*/
void printAllEmployee(CollegeManager sub){
/* 分析问题
* 1. 这里的CollegeEmployee 不是 SchoolManager 的直接朋友
* 2. CollegeEmployee 是以局部变量的方式出现在 SchoolManager
* 3. 违反了迪米特法则
* */
//解决方案,将输出学院的员工的方法,封装到CollegeManager
/* List<CollegeEmployee> list1 = sub.getAllEmployee();
System.out.println("----------------------分公司员工-------------------------");
for(CollegeEmployee e : list1){
System.out.println(e.getId());
}*/
sub.printEmployee();
List<Employee> list2 = this.getAllEmployee();
System.out.println("-------------------学校总部员工-------------------------");
for(Employee e : list2){
System.out.println(e.getId());
}
}
}
迪米特法则核心就是降低类之间的耦合