在Java中,实现可复用对象的最佳方法有两种:组合和继承。组合是指在一个类中的对象可以将其他类的对象作为自己的组成部分,这个过程就是对象的组合;继承是指派生类 extends 基类,派生类自动获得基类中的所有字段和方法,还有方法重写。
组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使客户端代码可以统一对待单个对象和组合对象,使得客户端代码不需要关心组成对象的类。
在Java中,组合模式可以通过接口和抽象类来实现,下面是一个简单的示例,演示了如何使用组合模式来表示一个电影院的电影放映系统。
我们定义一个Movie
接口,它包含一个show()
方法用于播放电影:
public interface Movie { void show(); }
我们创建两个具体的Movie
实现类:AnimationMovie
和ComedyMovie
:
public class AnimationMovie implements Movie { @Override public void show() { System.out.println("播放动画电影"); } } public class ComedyMovie implements Movie { @Override public void show() { System.out.println("播放喜剧电影"); } }
我们定义一个Cinema
接口,它包含一个addMovie()
方法用于向影院添加电影,以及一个moviePlays()
方法用于播放电影:
public interface Cinema { void addMovie(Movie movie); void moviePlays(); }
我们创建两个具体的Cinema
实现类:SmallCinema
和BigCinema
:
public class SmallCinema implements Cinema { private List<Movie> movies = new ArrayList<>(); @Override public void addMovie(Movie movie) { movies.add(movie); } @Override public void moviePlays() { for (Movie movie : movies) { movie.show(); } } }
public class BigCinema implements Cinema { private List<Cinema> cinemas = new ArrayList<>(); @Override public void addMovie(Movie movie) { for (Cinema cinema : cinemas) { cinema.addMovie(movie); } } @Override public void moviePlays() { for (Cinema cinema : cinemas) { cinema.moviePlays(); } } }
我们可以在客户端代码中使用组合模式来表示一个电影院的电影放映系统:
public class Main { public static void main(String[] args) { // 建立一个大的影院,包含多个小影院子系统 BigCinema bigCinema = new BigCinema(); bigCinema.addMovie(new AnimationMovie()); // 可以添加多个动画电影和喜剧电影等具体实现类的对象到大影院中进行放映。